
二叉树
Ao_Richard
个人学习理解笔记
展开
-
669、修剪二叉搜索树
给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L)。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。题解:与二叉搜索树删除节点操作一样,不同的是要遍历整个树,需要注意的是单层逻辑的实现。返回修剪后的节点嫁接到上层节点。原创 2024-07-06 22:23:44 · 250 阅读 · 0 评论 -
450、删除二叉搜索树中的节点
是 C++11 引入的一种关键字,用于自动推导变量的类型。编译器会根据变量的初始化表达式来推断变量的类型。对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。中通过递归返回值来加入新节点, 这里也可以通过递归返回值删除节点。遇到空返回,其实这也说明没找到删除的节点,遍历到空节点直接返回了。1)对单层递归逻辑即找到key值时的五种情况的分析。这里就把二叉搜索树中删除节点遇到的情况都搞清楚。节点的右子节点赋值给一个自动类型推导的变量。给定一个二叉搜索树的根节点。原创 2024-07-04 22:02:19 · 267 阅读 · 0 评论 -
235、二叉搜索树的最近公共祖先
重点在return上,满足条件进入左子树递归时,就只会一直沿着左边递归,有结果了就直接结束函数返回或者满足条件进入了向右方向的递归,总之,递归了一条线然后就返回。中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]本题就是标准的搜索一条边的写法,遇到递归函数的返回值,如果不为空,立刻返回。原创 2024-07-03 22:28:45 · 260 阅读 · 0 评论 -
501、二叉搜索树中的众数
所以其实不用遍历两遍:先遍历一遍找到长度最大的,再遍历一遍符合把这个长度val输出。先设立一个maxCount值,并从一开始就将符合的值放进去,之后动态的改变maxCount,当遍历得到的count比现在的maxcount更大时,就更新maxcount,并且把之前放进reslut的值都清空,把新的放进去。要点:重点在单层逻辑的处理中,因为是搜索树,所以按照中序遍历的话节点的值是递增的,所以形象化的可以将二叉树想成一段一段递增的数列,要找到众数,就是找到哪一段或几段是最长的。,找出并返回 BST 中的所有。原创 2024-07-01 22:24:32 · 428 阅读 · 0 评论 -
617、合并二叉树
想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;要求合并从根节点开始,那么就选择前序遍历,在tree1的基础上将tree1的节点重新修改。null 的节点将直接作为新二叉树的节点。合并过程必须从两个树的根节点开始。返回合并后的二叉树。原创 2024-06-26 19:30:32 · 197 阅读 · 0 评论 -
112、路径总和
1、注意回溯是发生在遍历完一个节点后在回溯,而不是在单层递归逻辑中,否则就相当于每次递归什么都没做。2、若采用递减判断,主函数传参传入的是减去了根节点值的目标值。的路径,这条路径上所有节点值相加等于目标和。和一个表示目标和的整数。是指没有子节点的节点。原创 2024-06-20 22:28:29 · 338 阅读 · 0 评论 -
404、左叶子之和
在递归中,在单层递归逻辑中,开始递归前决不能用ruturn来记录获得的值,否则递归就不会开始。题解:可以采用后序递归遍历的方式,先将左右子树的左叶子节点值计算出来,最后相加。当遍历到左叶子节点的父节点时就开始处理,将左叶子节点的值记录下来。原创 2024-06-19 20:17:53 · 243 阅读 · 0 评论 -
110.平衡二叉树
是指该树所有节点的左右子树的深度相差不超过 1。可以采用递归遍历每一个节点,得到其高度,在判断高度时不可避免的要用到其左右子树的高度,所以可以顺便判断出左右子树的高度相差是否大于1,若大于1,则该节点不是平衡的,整个子树也就不是平衡的。其中对节点的左右子树高度递归判断有漏洞,因为在递归的单层逻辑里对左右两个方向都做了判断,所以int LeftHeight = GetHeight(cur->left);这一语句是正确的判断整个左子树的情况,而不是单线的左子树。给定一个二叉树,判断它是否是 平衡二叉树。原创 2024-06-15 22:54:11 · 229 阅读 · 0 评论 -
94、二叉树的迭代遍历
实现对二叉树的前后序非递归遍历,然后递归返回的时候,从栈顶弹出上一次递归的各项参数,所以这就是递归为什么可以返回上一层位置的原因。所以可以用栈的方式实现遍历。原创 2024-06-09 23:07:44 · 285 阅读 · 0 评论 -
104、二叉树的最大深度
题解:所谓深度,就是树中某节点距离根节点的距离,如图中根节点3的深度为1,那节点7的深度为3,所谓高度,就是树中某节点距离末端叶子结点的距离,如图中7的高度为1,则节点3的高度为3,。有了这个认识,那么二叉树中的最大深度其实也就是根节点的高度。虽然知道每递归一次,高度就要+1(注意此时其实计算的是根节点的高度,因为是从递到末端节点才归来逐渐加1),要注意这个1要怎么加,要与递归相联系才能累加。是指从根节点到最远叶子节点的最长路径上的节点数。确定递归函数的参数和返回值;确定单层递归的逻辑;原创 2024-06-07 19:52:13 · 228 阅读 · 0 评论 -
226、翻转二叉树
题解:可以采用递归的方式进行翻转。前序递归:中->左->右 ,后序递归:左->右->中,中序递归不行,中序:左中右,当左边翻转完后,根节点再翻转,就把已经处理过的左边翻到右边,接着处理右边。,翻转这棵二叉树,并返回其根节点。函数在C++中用于交换两个变量的值。2、注意对传入参数异常情况的的判断;给你一棵二叉树的根节点。原创 2024-06-06 19:43:36 · 233 阅读 · 0 评论 -
二叉树--非递归遍历(前中后序,不统一写法)
那么再看看中序遍历,中序遍历是左中右,先访问的是二叉树顶部的节点,然后一层一层向下访问,直到到达树左面的最底部,再开始处理节点(也就是在把节点的数值放进result数组中),这就造成了。分析一下为什么刚刚写的前序遍历的代码,不能和中序遍历通用呢,因为前序遍历的顺序是中左右,先访问的元素是中间节点,要处理的元素也是中间节点,所以刚刚才能写出相对简洁的代码,前序遍历是中左右,每次先处理的是中间节点,那么先将根节点放入栈中,然后将右孩子加入栈,再加入左孩子。因为这样出栈的时候才是中左右的顺序。原创 2024-04-03 21:27:23 · 220 阅读 · 1 评论 -
二叉树及二叉树的递归遍历
2)确定终止条件:写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。二叉树的存储方式可以使线性数组,也可以是链表(与链表定义相似,只不过有左右两个节点指针)注意递归停止条件要放在递归语句之前,否则递归不会停止,直到出现访问空指针的错误。也就是 根-左-右 的遍历方式。1)确定递归的参数和返回值。3)确定单层递归的逻辑。原创 2024-04-02 11:38:12 · 191 阅读 · 1 评论