目录
235. 二叉搜索树的最近公共祖先
题目链接:235. 二叉搜索树的最近公共祖先
利用二叉搜索树的性质,如果p,q两节点同侧,调整根节点位置,直到pp,q两节点异侧,就找到了最近的公共祖先。
struct TreeNode* lowestCommonAncestor(struct TreeNode* root, struct TreeNode* p, struct TreeNode* q) {
while(root!=NULL){
//p,q结点都在根节点左侧
if(p->val<root->val&&q->val<root->val){
//根节点替换为左节点
root=root->left;
}
//p,q结点都在根节点右侧
else if(p->val>root->val&&q->val>root->val){
//根节点替换为右节点
root=root->right;
}
//p,q出现异侧说明该节点就是最近公共祖先
else{
return root;
}
}
return NULL;
}
701.二叉搜索树中的插入操作
题目链接:701. 二叉搜索树中的插入操作
在找到相应的插入位置之后,首先尝试了新建一个temp结点存储val的值,但就得思考如何将其挂到树上,看了别人的题解才通透。
struct TreeNode* insertIntoBST(struct TreeNode* root, int val){
//找到相应的位置
if(root==NULL){
root=(struct TreeNode*)malloc(sizeof(struct TreeNode));
root->val=val;
root->left=NULL;
root->right=NULL;
}
//当前结点值>val,找左子树
if(root->val>val){
root->left=insertIntoBST(root->left,val);
}
//当前结点值>val,找右子树
if(root->val<val){
root->right=insertIntoBST(root->right,val);
}
return root;
}
450.删除二叉搜索树中的节点
题目链接:450. 删除二叉搜索树中的节点
和二叉搜索树节点的插入类似,在找到删除元素位置时的处理要分情况讨论,当要删除节点的左右子树都非空时,可以选择将左子树挂到右子树最左边节点或者将右子树挂到左子树最右边节点。
struct TreeNode* deleteNode(struct TreeNode* root, int key){
//到叶子结点返回NULL
if(root==NULL) return NULL;
//找到了删除位置
if(root->val==key){
//左子树为空返回右子树
if(root->left==NULL) return root->right;
//右子树为空返回左子树
if(root->right==NULL) return root->left;
//左右子树都非空,将左子树挂到右子树最左面结点上
struct TreeNode* tmp=root->right;
//找到右子树的做左边结点
while(tmp->left){
tmp=tmp->left;
}
tmp->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;
}