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

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

时间:2024-08-14 13:54:39浏览次数:9  
标签:right TreeNode cur 二叉 搜索 return NULL 树中 left

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

题目
根据二叉搜索树的特性,它的公共祖先肯定是值夹在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;


}

标签:right,TreeNode,cur,二叉,搜索,return,NULL,树中,left
From: https://blog.csdn.net/wwwgxd/article/details/141185846

相关文章

  • 每日一题:Leetcode-662 二叉树最大宽度
    力扣题目解题思路java代码力扣题目:给你一棵二叉树的根节点 root ,返回树的 最大宽度 。树的 最大宽度 是所有层中最大的 宽度 。每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树结构相同,两端点间会出现一些......
  • 实现二叉树的前序遍历
    序遍历的顺序是:先访问根节点,再访问左子树,最后访问右子树。递归和迭代classTreeNode{intval;TreeNodeleft;TreeNoderight;TreeNode(intval){this.val=val;this.left=null;this.right=null;}}publicclass......
  • 实现二叉树的中序遍历
    中序遍历的顺序是:先访问左子树,再访问根节点,最后访问右子树。 classTreeNode{intval;TreeNodeleft;TreeNoderight;TreeNode(intval){this.val=val;this.left=null;this.right=null;}}publicclassInorde......
  • django常用的组合搜索组件
    文章目录django常用的组合搜索组件快速使用配置信息1.视图函数2.前端模板3.css样式代码实现django常用的组合搜索组件在项目开发中,如果有大量数据就要用到组合搜索,通过组合搜索对大块内容进行分类筛选。快速使用三步走:(其实主要就是传入配置信息)创建组合搜索......
  • 8.14信息学集训_树、搜索与剪枝
    目录P1305新二叉树B3642二叉树的遍历P4913【深基16.例3】二叉树深度P3884[JLOI2009]二叉树问题P8681[蓝桥杯2019省AB]完全二叉树的权值P1434[SHOI2002]滑雪P1040[NOIP2003提高组]加分二叉树P1074[NOIP2009提高组]靶形数独P2827[NOIP2016提高组]蚯蚓T266208......
  • 日撸Java三百行(day22:二叉树的存储)
    目录前言一、压缩存储二、层次遍历三、代码实现1.顺序表创建及初始化2.方法创建3.数据测试4.完整的程序代码总结前言关于二叉树的存储,昨天我们提到有顺序存储和链式存储这两种方式,不过非完全二叉树顺序存储的话会造成很大的空间浪费,所以我们昨天使用的是链式存储......
  • 编写一个程序,打开和读取一个文本文件,并统计文件中每个单词出现的次数。用改进的二叉查
    /编写一个程序,打开和读取一个文本文件,并统计文件中每个单词出现的次数。用改进的二叉查找树存储单词及其出现的次数。程序在读入文件后会提供一个有三个选项菜单。第一个选项是列出所有的单词和出现的次数。第二个选项是让用户输入一个单词,程序报告该单词在文件中出现的次数。......
  • (算法)猜数字⼤⼩II————<暴搜->记忆化搜索->动态规划>
    1.题⽬链接:375.猜数字⼤⼩II2.题⽬描述:3.解法(暴搜->记忆化搜索):算法思路:暴搜:a.递归含义:给dfs⼀个使命,给他⼀个区间[left,right],返回在这个区间上能完胜的最⼩费⽤;b.函数体:选择[left,right]区间上的任意⼀个数作为头结点,然后递归分析左右⼦树。求出所有情况......
  • (算法)最⻓递增⼦序列————<暴搜->记忆化搜索->动态规划>
    1.题⽬链接:300.最⻓递增⼦序列2.题⽬描述:3.解法(暴搜->记忆化搜索->动态规划):算法思路:暴搜:a.递归含义:给dfs⼀个使命,给他⼀个数i,返回以i位置为起点的最⻓递增⼦序列的⻓度;b.函数体:遍历i后⾯的所有位置,看看谁能加到i这个元素的后⾯。统计所有情况下的最⼤值。......
  • 代码随想录算法训练营第十四天(一)| 226.翻转二叉树 101. 对称二叉树
    226.翻转二叉树题目:给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[]提示:树中节点数目范围在 [0,100] 内-100<=......