代码随想录训练营day20|235. 二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作,450.删除二叉搜索树中的节点

二叉搜索树的最近公共祖先

题目
根据二叉搜索树的特性,它的公共祖先肯定是值夹在p和q之间的(满足此条件的第一个点)

TreeNode* getroot(TreeNode* root,TreeNode* p,TreeNode* q){
	if(rooot==NULL) return NULL;
	if(root->val<p->val&&root->val<q->val){
		return getroot(root->right,p,q);
	}
	else if(root->val>p->val&&root->val>q->val)
		return getroot(root->left,p,q);
	else
		return root;

}

二叉搜索树中的插入操作

题目
其实就是想二分查找插入数组时一样,一直到空节点,然后创建空间。

TreeNode* fun.....
if(cur==NULL){
	cur=new TreeNode(val);
	return cur;
}
if(cur->val<val){
	cur->right=fun(cur->right);//用来接住结果
}
...

或者一开始直接在参数那加个引用,这样就可以直接更改right和left

TreeNode* fun(TreeNode* &cur)…

删除二叉搜索树中的节点。

题目
首先应该先找到要删除的节点,然后分情况讨论。
1.要删除的是叶子节点。
2.要删除的节点有一边为空。
3.要删除的节点两边都不为空

如果删除的节点两边都不为空,那左边会比右边所有都小,右边会比左边所有都大,所以有两种接发:1.找到右子树的最左边,把左子树接到那里。2.找到左子树的最右边,把右子树接到那里。

要得到删除后的根节点,所以函数返回TreeNode*

TreeNode* delete(TreeNode*cur,int key){
	if(cur==NULL) return NULL;//找遍了也没找到
	if(cur->val==key){
		if(cur->left==NULL&&cur->right==NULL)
			return NULL;
		else if(cur->left!=NULL&&cur->right==NULL)
			return cur->left;//将它返回给cur的上一层
		else if(cur->right!=NULL&&cur->left==NULL)
			return cur->right;
		else{
			TreeNode* temp=cur->right;
			while(temp->left!=NULL)
				temp=temp->left;
			temp->left=cur->left;
			TreeNode* a=cur->right;
			delete cur;
			return a;	
		}
	}
	if(cur->val<key)
		cur->right=delete(right,key);//cur->right接住更改后的结果
	if(cur->val>key)
		cur->left=delete(left,key);
	return root;


}
  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值