题目:235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作
450.删除二叉搜索树中的节点
需要重做:
235. 二叉搜索树的最近公共祖先
思路1:迭代,从上往下,在两个中间的就是答案
注意:
代码:
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
while(root){
if(root->val<p->val&&root->val<q->val){
root=root->right;
}
else if(root->val>p->val&&root->val>q->val){
root=root->left;
}
else return root;
}
return nullptr;
}
};
思路2:递归:从上往下搜索,最近的公共祖先一定是从上往下,夹在两个中间的情况
注意:这里每个都return,即从上往下找,找到就return;区别于二叉树的最近公共祖先:是从低向上的,所以不是每个都return;
代码:
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root==nullptr)return root;
if(root->val<q->val&&root->val<p->val){
return lowestCommonAncestor(root->right,p,q);
}
else if(root->val>q->val&&root->val>p->val){
return lowestCommonAncestor(root->left,p,q);
}
else return root;
}
};
701.二叉搜索树中的插入操作
思路1:迭代,从上往下找要插入的位置就好了
注意:
代码:
class Solution {
public:
TreeNode* insertIntoBST(TreeNode* root, int val) {
TreeNode*r=root;
TreeNode*tmp=new TreeNode(val);
if(!root)return tmp;
while(root){
if(root->val>val){
if(root->left==nullptr){
root->left=tmp;
break;
}
else root=root->left;
}
else{
if(root->right==nullptr){
root->right=tmp;
break;
}
else root=root->right;
}
}
return r;
}
};
思路2:递归
注意:注意思路;
代码:
class Solution {
public:
TreeNode* insertIntoBST(TreeNode* root, int val) {
//停止条件:到空的时候,返回
if(root==nullptr){
TreeNode* node =new TreeNode(val);
return node;
}
//单层逻辑:如果当前大于value,在rootleft中接着找,最后返回的是一个加了节点的root-》left
if(root->val>val)root->left= insertIntoBST(root->left,val);
if(root->val<val)root->right=insertIntoBST(root->right,val);
//找完了之后,返回root
return root;
}
};
450.删除二叉搜索树中的节点
思路:
5种情况。
//1.没有待删除结点,到了nullptr,直接return
找到了key的情况
//2.是叶子结点的话,delete 之后直接返回
//3.左孩子为空,右孩子不为空。删除后返回右孩子
//4.右孩子为空,左孩子不为空。删除后返回左孩子
//5.左右都不为空。把左孩子放到右孩子的最左边,返回根的右孩子
注意:
执行逻辑的地方需要接住,一层层传递回去
代码:
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
//终止
if(root==nullptr)return root;//1.没有待删除结点,直接返回root
//单层
if(root->val==key){
//2.删除是叶子节点,则删除后return
if(root->left==nullptr&&root->right==nullptr){
delete root;
return nullptr;
}
//3.删除非叶子节点,左孩子空,则删除后return右孩子
else if(root->left==nullptr&&root->right!=nullptr){
TreeNode*tmp=root->right;
delete root;
return tmp;
}
//4.删除非叶子结点,右孩子空,则删除后return左孩子
else if(root->left!=nullptr&&root->right==nullptr){
TreeNode*tmp=root->left;
delete root;
return tmp;
}
//5.左右都非空,删除后把左孩子加到右孩子最左的左边,return右孩子
else{
TreeNode*des=root->right;
while(des->left!=nullptr){
des=des->left;
}
des->left=root->left;
TreeNode*tmp=root;
root=root->right;
delete tmp;
return root;
}
}
if(root->val<key){
root->right=deleteNode(root->right,key);
}
if(root->val>key){
root->left=deleteNode(root->left,key);
}
return root;
}
};