思路:
利用二叉搜索树的特性,二叉搜索树要用中序遍历。
公共祖先一定是满足在两个数中间
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
//终止条件
if(root==nullptr){return root;}
if(root->val<p->val&&root->val<q->val){
return lowestCommonAncestor(root->right,p,q);
}
if(root->val>p->val&&root->val>q->val){
return lowestCommonAncestor(root->left,p,q);
}
return root;
}
};
701.二叉搜索树中的插入操作
题目链接:701. 二叉搜索树中的插入操作 - 力扣(LeetCode)
文章讲解:代码随想录
class Solution {
public:
TreeNode* insertIntoBST(TreeNode* root, int val) {
if(root==nullptr){
TreeNode* node = new TreeNode(val);
return node;
}
if(root->val>val){
root->left=insertIntoBST(root->left,val);
}
if(root->val<val){
root->right=insertIntoBST(root->right ,val);
}
return root;
}
};
删除二叉搜索树中的节点
题目链接:450. 删除二叉搜索树中的节点 - 力扣(LeetCode)
文章讲解:代码随想录
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
//终止条件
if(root==nullptr)return nullptr;
if(root->val==key){
//叶子节点
if(root->left==nullptr&&root->right==nullptr){
return nullptr;
}
//左空,右不空
if(root->left==nullptr&&root->right!=nullptr){
return root->right;
}
//左不空,右空
if(root->left!=nullptr&&root->right==nullptr){
return root->left;
}
//左右都不空
if(root->left!=nullptr&&root->right!=nullptr){
auto cur=root->right;
while(cur->left!=nullptr){cur=cur->left;}
cur->left=root->left;
return root->right;
}
}
if(root->val>key){
root->left=deleteNode(root->left,key);
}
if(root->val<key){
root->right=deleteNode(root->right,key);
}
return root;
}
};
上面的代码没有释放内存
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
//终止条件
if(root==nullptr)return nullptr;
if(root->val==key){
//叶子节点
if(root->left==nullptr&&root->right==nullptr){
delete root;
return nullptr;
}
//左空,右不空
if(root->left==nullptr&&root->right!=nullptr){
auto right=root->right;
delete root;
return right;
}
//左不空,右空
if(root->left!=nullptr&&root->right==nullptr){
auto left=root->left;
delete root;
return left;
}
//左右都不空
if(root->left!=nullptr&&root->right!=nullptr){
auto cur=root->right;
while(cur->left!=nullptr){cur=cur->left;}
cur->left=root->left;
auto right=root->right;
delete root;
return right;
}
}
if(root->val>key){
root->left=deleteNode(root->left,key);
}
if(root->val<key){
root->right=deleteNode(root->right,key);
}
return root;
}
};