![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
二叉树
leetcode 二叉树题目
why_1513
求实求真,大气大气
展开
-
把二叉搜索树转化为累加树-力扣
本题使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和,意味着我们需要从二叉搜索树最大的那个节点开始,按照右中左的顺序逐个进行累加,那么使用一个全局遍历 pre 来记录当前节点的前一个节点即可。原创 2024-06-13 15:51:27 · 184 阅读 · 0 评论 -
将有序数组转化为二叉搜索树-力扣
本题的解题思路是,每次使用数组的中间元素来创建节点,然后递归的用中间元素左侧的元素和右侧的元素来创建左右子节点。原创 2024-06-13 15:36:18 · 282 阅读 · 0 评论 -
修剪二叉搜索树-力扣
上述代码在对左右子树进行搜索时,加了 root->val >= low 和 root->val原创 2024-06-13 11:22:06 · 276 阅读 · 0 评论 -
删除二叉搜索树中的节点-力扣
本题的解题思路时首先在二叉搜索树中找到需要删除的值,然后将节点删除,并重构删除后的左右子树部分。原创 2024-06-12 22:28:47 · 105 阅读 · 0 评论 -
二叉搜索树中的插入操作-力扣
根据插入值和节点值的大小,进入二叉搜索树的左子树或者右子树,遇到空节点时,插入即可。原创 2024-06-12 21:42:30 · 192 阅读 · 0 评论 -
二叉搜索树的最近公共祖先-力扣
本题于二叉树的最近公共祖先相比,只需根据节点的数值大小,搜索树的一边即可。原创 2024-06-12 21:20:31 · 76 阅读 · 0 评论 -
二叉树的最近公共祖先-力扣
【代码】二叉树的最近公共祖先-力扣。原创 2024-06-12 21:09:03 · 219 阅读 · 1 评论 -
二叉搜索树中的众数-力扣
二叉搜索树的元素使用中序遍历,则可以得到一个有序的序列,那么判断前一个节点 和 当前节点的值是否相等,就可以统计一个数出现的次数,当一个数出现的次数大于当前的最大次数时,更新众数并清空之前的返回数组,添加新的众数进入数组。这样就只需遍历一次,且无需使用map等容器耗费额外的空间。原创 2024-06-12 16:58:19 · 224 阅读 · 1 评论 -
二叉搜索树的最小绝对差-力扣
刚开始做想要在原函数直接进行递归,由于返回值是int类型,返回的是子树比较的最小值,则需要对子树返回的最小值,前一个节点和当前节点的差值,当前大二最小值四个值进行比较,比较繁琐;在初始化minNum和遇到nullptr返回时,不能返回0,会干扰结果,应当初始化为INT_MAX,这样不论如何都不会影响到结果。如果不适用原函数递归,则只需比较当前节点和前一个节点的差值与当前最小值的大小。原创 2024-06-12 13:48:57 · 207 阅读 · 0 评论 -
验证二叉搜索树-力扣
第一次做这道题时,想的解法是递归去判断比较左节点小于中间节点,右节点大于中间节点,而这恰恰进入了陷阱,这道题不仅仅是判断子树是否左节点小于中间节点,右节点大于中间节点;要比较的是 左子树所有节点小于中间节点,右子树所有节点大于中间节点。正确的递归应该是使用中序遍历的顺序,挨个比较两两大小,是否满足二叉搜索树的性质,这里利用一个全局变量pre来记录当前节点的前一个节点。也可以使用中序遍历得到一个数组,然后遍历这个数组,如果这个数组是递增的,则这个树二叉搜索树。原创 2024-06-12 13:14:06 · 411 阅读 · 0 评论 -
二叉搜索树中的搜索-力扣
二叉搜索树中,左子树的节点都是小于根节点的,右子树的节点都是大于根节点的。原创 2024-06-12 12:43:31 · 65 阅读 · 0 评论 -
合并二叉树-力扣
合并二叉树,从根节点开始,如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。原创 2024-06-12 11:03:25 · 216 阅读 · 0 评论 -
最大二叉树-力扣
每次递归需要找到当前数组的最大值和对应的下标,将这个数组一分为二来构造左右子树,值得注意的点是确定边界,当最大值的下标在数组首部或者末尾,则用来构造左右子树的一个数组为空,此时就无需再构造了。本题同样是根据给定数组,构造一个二叉树。原创 2024-06-11 21:46:44 · 159 阅读 · 0 评论 -
从前序与中序遍历序列构造二叉树-力扣
与后序与中序遍历构造类似。原创 2024-06-11 21:23:33 · 127 阅读 · 1 评论 -
从中序与后序遍历序列构造二叉树-力扣
【代码】从中序与后序遍历序列构造二叉树-力扣。原创 2024-06-11 20:37:41 · 562 阅读 · 0 评论 -
路径总和Ⅱ-力扣
同样可以像路径总和一样,对代码进行处理,减少传入的参数,减少拷贝操作。与路径总和类似,只不过需要额外用数组来记录节点。原创 2024-06-11 19:55:04 · 163 阅读 · 0 评论 -
路径总和-力扣
本题想到的解法是对二叉树进行深度搜索,并记录路径和,当节点为叶子节点时,将路径和与目标值进行判断,如果相等则返回true,否则返回false,最后返回左右子树或的值即可,因为只需有一条满足条件就可以。力扣官方的递归更为精妙,顺便记录一下:将问题转化为是否存在从当前节点的子节点到叶子的路径,满足其路径和为 sum - val。原创 2024-06-11 17:13:57 · 298 阅读 · 0 评论 -
找树左下角的值-力扣
首先想到的解法是对二叉树进行层序遍历,并记录本层第一个节点的值,当层序遍历结束时,此时记录的值即为树最底层最左边的值。本题个人认为不能叫做 找树左下角的值,左下角再怎么说也应当在树的左子树上,本题要求的节点是树最底层最左边的值。原创 2024-06-11 11:14:32 · 287 阅读 · 0 评论 -
左叶子之和-力扣
本题计算二叉树的左叶子之和,使用后序遍历的顺序对二叉树进行深度搜索,关键点在于,对左叶子节点的值的操作上,需要在左叶子节点的父节点进行。原创 2024-06-11 11:03:39 · 614 阅读 · 0 评论 -
二叉树的所有路径-力扣
这道题目需要返回给定二叉树所有从根节点到叶子节点的路径,那么对二叉树进行深度优先搜索,遇到节点就将其加到路径中,如果这个节点的左右子节点都为空,那么它就是一个叶子节点,将这条路径加入到结果数组中。这里将int 转换为 string 使用了 to_string()函数。原创 2024-06-10 19:45:56 · 277 阅读 · 0 评论 -
平衡二叉树-力扣
看到题目想到的解法是对根节点的左右子树进行最大深度求解,然后比较最大深度的绝对值是否小于等于1,如果是,那么是平衡二叉树,如果不是,那么不是平衡二叉树。但是这样求解忽视了平衡二叉树的条件,其树上每个节点的左右子树都需要满足深度差不超过1。因此在返回是,还要加上条件,根节点的左右子树也平衡。原创 2024-06-09 20:16:57 · 211 阅读 · 0 评论 -
完全二叉树的节点个数-力扣
因此,完全二叉树只有叶子节点一层的右侧缺少节点,对树的左节点和右节点进行递归,如果两者深度相同,则这棵树的节点数为2^k - 1,否则对左右子树进行判断,这样即可不用遍历整个树中符合完全二叉树的子树部分就。完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。原创 2024-06-09 19:53:07 · 132 阅读 · 0 评论 -
二叉树的最小深度-力扣
使用DFS,在取左右子树的最小值时,需要注意,当左右子树只存在一颗时,此时有一个返回值为0,此时不能用0作为最小深度,而是另一颗不为0的子树的最下深度,才是需要的值。使用BFS对二叉树进行层序遍历,与最大深度相比,只需在将节点加入队列时,判断节点的左右子节点是否都不存在,如果都不存在,则直接返回最小深度即可。原创 2024-06-06 17:04:04 · 282 阅读 · 0 评论 -
N叉树的最大深度-力扣
本题使用层序遍历则和二叉树的最大深度没有太大区别,只有在节点入队时,二叉树是左右子节点入队,而N叉树则是子节点列表入队。使用递归则需要去记录子节点深度的最大值,并进行返回。原创 2024-06-08 16:31:51 · 176 阅读 · 2 评论 -
二叉树的最大深度-力扣
使用DFS分别搜索左右子树的最大深度,然后得到的最大值+1就是二叉树的最大深度。使用BFS,则在层序遍历每层时,将深度+1即可。原创 2024-06-06 16:38:35 · 132 阅读 · 0 评论 -
另一棵树的子树-力扣
本题本质上也是去判断一棵树与另一棵树是否相等,只不过是拿树B去和树A的根节点开始,进行比较。原创 2024-06-08 15:34:09 · 140 阅读 · 0 评论 -
相同的树-力扣
尽管代码思路很简单,但在实现时,一开始习惯性的写成了层序遍历那样,在将子节点入队时,判断了子节点不为空才让子节点入队,导致出现误判的情况。这里即使是空节点,也是需要入队进行比较的,因为一个树的这个节点为空,但另一棵树对应的这个节点可不一定。这道题目与堆成二叉树题目很相似,对称二叉树是每次传入的节点组合是 《左子树的左节点 和 右子树的 右节点》 《左子树的右节点 和 右子树的左节点》, 而这道题就更加简单,传入两棵树的左节点和右节点即可。原创 2024-06-08 14:39:28 · 237 阅读 · 0 评论 -
对称二叉树-力扣
使用递归的方法来进行解题,判断的是两个子树的节点是否是对称的,因此递归函数的参数是左子树节点和右子树节点。原创 2024-06-07 17:28:26 · 283 阅读 · 0 评论 -
翻转二叉树-力扣
翻转二叉树,通过前序遍历的顺序,从根节点开始,将节点的左右子节点一次进行交换即可。原创 2024-06-06 21:59:44 · 206 阅读 · 0 评论 -
填充每个节点的下一个右侧节点Ⅱ-力扣
本题如果使用BFS去层序遍历,代码和 填充每个节点的下一个右侧节点 题没有任何区别。但是使用已经建立好的next链表去做,则需要考虑到next指向的节点子节点是否为空的可能。原创 2024-06-06 11:53:09 · 235 阅读 · 0 评论 -
填充每个节点的下一个右侧节点指针-力扣
本题使用BFS对二叉树进行搜索,然后将每个节点的next指向右侧节点,当节点为一层的最后也给节点时,将其next指向nullptr。原创 2024-06-06 10:44:25 · 230 阅读 · 0 评论 -
在每个树行中找最大值-力扣
使用BFS对二叉树进行遍历,并标记每层的最大值。原创 2024-06-06 10:31:03 · 78 阅读 · 0 评论 -
N叉树的层序遍历-力扣
本题同样是二叉树的层序遍历的扩展,只不过二叉树每个节点的子节点只有左右节点,而N叉树的子节点是一个数组,层序遍历到一个节点时,需要将这个节点的子节点数组的每个节点都入队。原创 2024-06-05 21:38:06 · 372 阅读 · 0 评论 -
二叉树的层平均值-力扣
这道题目也是二叉树的层序遍历的扩展,刚开始想到的方法是在层序遍历时,统计好每层的元素,让后将其平均后添加到返回数组,但是一开始将sum定义为了Int类型,即使avg是double类型,但是得到的结果仍然只有整数部分有效,原因是sum/vec.size() 在运算完后,才将值赋给avg,而运算的结果是int类型。同样,这个保存每层元素的数组也没必要存在,只需在遍历时,将sum进行累加就可以,插入元素的数目与队列的大小也是一致的。原创 2024-06-05 21:25:23 · 283 阅读 · 0 评论 -
二叉树的右视图-力扣
这道题目是二叉树的层序遍历的扩展,对二叉树进行层序遍历,判断节点是否为该层的最后一个节点,如果是,则将其的数值添加到返回数组中。原创 2024-06-05 20:30:10 · 222 阅读 · 0 评论 -
二叉树的层序遍历Ⅱ-力扣
很简单的一道题,将前一道题的结果数组进行一次反转即可。原创 2024-06-05 20:16:03 · 328 阅读 · 0 评论 -
二叉树的层序遍历-力扣
本题是二叉树的层序遍历,通过一个队列来控制遍历的节点,二叉树每层的节点和上一层入队的节点个数是相同的,根据这一点编写循环条件。原创 2024-06-05 19:59:36 · 405 阅读 · 0 评论 -
二叉树的统一迭代法-前序中序后序-力扣
通过对入栈的节点进行标记,只有当标记出现时,才将该元素添加到输出数组中,否则就继续遍历下去。通过更改标记节点 和左右节点的入栈顺序,从而达到只需修改代码顺序,就能切换功能,实现代码统一的目的。之前写的二叉树的前中后序遍历的迭代方法,中序遍历与前序后序遍历的代码并不统一,无法像递归那样只是修改顺序,就可以完成,在看完代码随想录二叉树的统一迭代法的章节后,记录一下。,可以发现,使用NULL来标记需要处理的节点,在遍历时,只需更改左右节点和中间节点的入栈顺序,就能实现不同的遍历顺序。原创 2024-06-05 11:13:58 · 234 阅读 · 0 评论 -
二叉树的中序遍历-力扣
二叉树的中序遍历,指首先遍历左节点,然后遍历中间节点,最后遍历右节点,按照这个顺序进行递归即可。原创 2024-06-05 10:09:29 · 652 阅读 · 0 评论 -
二叉树的后序遍历-力扣
二叉树的后序遍历,指首先遍历二叉树的左节点,然后遍历二叉树的右节点,最后遍历中间节点。按照顺序进行递归遍历即可。原创 2024-06-05 10:05:30 · 316 阅读 · 0 评论