一,代码随想录leetcode235二叉搜索树的最近公共祖先
解题思路:本题给出一个二叉搜索树以及两个结点,要求返回这两个结点的最近公共祖先。本题使用递归来解决。1,确定函数的返回类型为二叉树的结点类型。传入的函数参数为一个root结点,还有两个给出的要寻找公共祖先的结点。2,确定返回条件,当传入的root结点为空的时候,直接返回null。3,确定单层递归的逻辑,假如二叉树的p和q结点的数值都小于当前的root结点,就向左递归。并且用left来接收递归的数值。假如left不为空,说明在左子树中找到了满足要求的结点,把left向上返回即可。向右递归的处理逻辑同上。假如不满足上面两种情况,说明p和q此时刚好分别在root结点的两侧,那么root就是最近公共祖先,返回root即可。
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root==NULL)return NULL;
if(p->val<root->val&&q->val<root->val){
TreeNode* left=lowestCommonAncestor(root->left,p,q);
if(left)return left;
}
if(p->val>root->val&&q->val>root->val){
TreeNode* right=lowestCommonAncestor(root->right,p,q);
if(right)return right;
}
return root;
}
};
迭代法:把root数值赋值给cur,假如cur不为空就进入循环,循环内的逻辑与递归法相同。
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
TreeNode* cur=root;
while(cur){
if(p->val>cur->val&&q->val>cur->val)cur=cur->right;
else if(p->val<cur->val&&q->val<cur->val)cur=cur->left;
else return cur;
}
return NULL;
}
};
解题思路:本题给定一个数值要求插入到二叉搜索树中。将其作为一个叶子节点插入到二叉搜索树中即可。使用递归法解决。1,确定返回类型为二叉树的结点类型。传入的参数为一个二叉树root结点以及要插入的数值。2,确定返回条件。假如root为空结点,说明此时就是要插入的地方,new一个结点,结点val设置为传入的参数,然后把这个结点向上返回即可。3,单层递归的逻辑,假如val小于当前遍历结点的值,就向左递归,使用left结点接收向左递归的结果。向右递归的逻辑同理。左右递归的逻辑都处理完之后,返回root结点即可。
class Solution {
public:
TreeNode* insertIntoBST(TreeNode* root, int val) {
if(root==nullptr){
TreeNode* node=new TreeNode(val);
return node;
}
if(val<root->val){
root->left=insertIntoBST(root->left,val);
}
if(val>root->val){
root->right=insertIntoBST(root->right,val);
}
return root;
}
};
解题思路:本题给出一个二叉树以及一个key值,要求在二叉树中找到并且删除这个结点。1,确定返回类型和传入的参数。2,确定返回条件,本题涉及五种条件,没找到,找到了是叶子节点,找到了左空右不空,找到了左不空右空,找到了左右都不空。这里讨论第五种情况,在当前要删除结点的右子树的最左节点,把root的左子树接上,然后就变成了第二种情况。3,确定单层递归逻辑 略。
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
if(root==nullptr)return nullptr;
if(root->val==key){
if(!root->right&&!root->left){
delete root;
return nullptr;
}
else if(!root->right&&root->left){
TreeNode* t=root->left;
delete root;
return t;
}
else if(root->right&&!root->left){
TreeNode* t=root->right;
delete root;
return t;
}
else{
TreeNode* cur=root->right;
while(cur->left){
cur=cur->left;
}
cur->left=root->left;
TreeNode* t=root;
root=root->right;
delete t;
return root;
}
}
if(root->val<key){
root->right=deleteNode(root->right,key);
}
if(root->val>key){
root->left=deleteNode(root->left,key);
}
return root;
}
};