二叉树
文章平均质量分 71
二叉树
gyjllll
这个作者很懒,什么都没留下…
展开
-
二叉树总结
在二叉树题目选择什么遍历顺序是不少同学头疼的事情,我们做了这么多二叉树的题目了,Carl给大家大体分分类。涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。注意在普通二叉树的属性中,我用的是一般为后序,例如单纯求深度就用前序,找所有路径这道题也用了前序,这是为了方便让父节点指向子节点。所以求普通二叉树的属性还是要具体问题具体分析。原创 2024-01-20 20:17:48 · 844 阅读 · 0 评论 -
538. 把二叉搜索树转换为累加树
给出二叉树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点node的新值等于原树中大于或等于node.val的值之和。本题和 1038:相同[1,null,1][3,3,2][7,9,4,10]原创 2024-01-20 19:47:46 · 751 阅读 · 0 评论 -
108. 将有序数组转换为二叉搜索树
再来看参数,首先是传入数组,然后就是左下标left和右下标right,在构造二叉树的时候尽量不要重新定义左右区间数组,而是用下标来操作原数组。上图中,是符合二叉搜索树的特性吧,如果要这么做的话,是不是本题意义就不大了,所以才强调是平衡二叉搜索树。如果要分割的数组长度为偶数的时候,中间元素为两个,是取左边元素 就是树1,取右边元素就是树2。例如 有序数组[-10,-3,0,5,9] 就可以构造成这样的二叉搜索树,如图。删除二叉树节点,增加二叉树节点,都是用递归函数的返回值来完成,这样是比较方便的。原创 2024-01-20 19:23:05 · 373 阅读 · 0 评论 -
669. 修剪二叉搜索树
删除节点的时候,从上到下遍历时,如果遇到不符合要求的,不要把这个节点以及后续都删了,因为假如说这个节点比左边界小,那这个节点的右子树可能有符合区间的。如果root(当前节点)的元素小于low的数值,那么应该递归右子树,并返回右子树符合条件的头结点。如果root(当前节点)的元素大于high的,那么应该递归左子树,并返回左子树符合条件的头结点。然后如下代码相当于用节点3的左孩子 把下一层返回的 节点0的右孩子(节点2) 接住。此时节点3的左孩子就变成了节点2,将节点0从二叉树中移除了。原创 2024-01-20 18:50:22 · 776 阅读 · 0 评论 -
450. 删除二叉搜索树中的节点
给定一个二叉搜索树的根节点和一个值,删除二叉搜索树中的对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。另一个正确答案是 [5,2,6,null,4,null,7]。二叉树不包含值为 0 的节点[][0, 104]root。原创 2024-01-20 13:48:26 · 858 阅读 · 0 评论 -
701. 二叉搜索树中的插入操作
给定二叉搜索树(BST)的根节点root和要插入树中的值value,将值插入二叉搜索树。返回插入后二叉搜索树的根节点。输入数据,新值和原始二叉搜索树中的任意节点值都不同。,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。你可以返回。另一个满足题目要求可以通过的树是:[0, 104]Node.valval。原创 2024-01-20 12:23:21 · 773 阅读 · 0 评论 -
235. 二叉搜索树的最近公共祖先
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]6节点2和节点8的最近公共祖先是6。2节点2和节点4的最近公共祖先是2, 因为根据定义最近公共祖先节点可以为节点本身。原创 2024-01-20 11:20:13 · 844 阅读 · 0 评论 -
236. 二叉树的最近公共祖先
求最小公共祖先,需要从底向上遍历,那么二叉树,只能通过后序遍历(即:回溯)实现从底向上的遍历方式。在回溯的过程中,必然要遍历整棵二叉树,即使已经找到结果了,依然要把其他节点遍历完,因为要使用递归函数的返回值(也就是代码中的left和right)做逻辑判断。要理解如果返回值left为空,right不为空为什么要返回right,为什么可以用返回right传给上一层结果。原创 2024-01-20 10:55:04 · 849 阅读 · 0 评论 -
501. 二叉搜索树中的众数
给你一个含重复值的二叉搜索树(BST)的根节点root,找出并返回 BST 中的所有(即,出现频率最高的元素)。如果树中有不止一个众数,可以按返回。原创 2024-01-20 10:19:51 · 865 阅读 · 0 评论 -
530. 二叉搜索树的最小绝对差
给你一个二叉搜索树的根节点root,返回。差值是一个正数,其数值等于两值之差的绝对值。11。原创 2024-01-20 09:08:30 · 319 阅读 · 0 评论 -
98. 验证二叉搜索树
给你一个二叉树的根节点root,判断其是否是一个有效的二叉搜索树。truefalse根节点的值是 5 ,但是右子节点的值是 4。[1, 104]原创 2024-01-18 22:41:05 · 716 阅读 · 0 评论 -
700. 二叉搜索树中的搜索
给定二叉搜索树(BST)的根节点root和一个整数值val。你需要在 BST 中找到节点值等于val的节点。返回以该节点为根的子树。如果节点不存在,则返回null。原创 2024-01-18 21:46:56 · 374 阅读 · 0 评论 -
617. 合并二叉树
给你两棵二叉树:root1和root2。想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,null 的节点将直接作为新二叉树的节点。返回合并后的二叉树。合并过程必须从两个树的根节点开始。[2,2][0, 2000]相信这道题目很多同学疑惑的点是如何同时遍历两个二叉树呢?其实和遍历一个树逻辑是一样的,只不过传入两个树的节点,同时操作。原创 2024-01-18 21:28:13 · 1033 阅读 · 0 评论 -
654. 最大二叉树
题目中说了输入的数组大小一定是大于等于1的,所以我们不用考虑小于1的情况,那么当递归遍历的时候,如果传入的数组大小为1,说明遍历到了叶子节点了。- [3,2,1,6,0,5] 中的最大值是 6 ,左边部分是 [3,2,1] ,右边部分是 [0,5]。- [3,2,1] 中的最大值是 3 ,左边部分是 [] ,右边部分是 [2,1]。- [2,1] 中的最大值是 2 ,左边部分是 [] ,右边部分是 [1]。参数传入的是存放元素的数组,返回该数组构造的二叉树的头结点,返回类型是指向节点的指针。原创 2023-12-27 15:21:35 · 859 阅读 · 0 评论 -
105. 从前序与中序遍历序列构造二叉树
请构造二叉树并返回其根节点。原创 2023-12-27 11:37:53 · 344 阅读 · 0 评论 -
106. 从中序与后序遍历序列构造二叉树
首先回忆一下如何根据两个顺序构造一个唯一的二叉树,相信理论知识大家应该都清楚,就是以 后序数组的最后一个元素为切割点,先切中序数组,根据中序数组,反过来再切后序数组。中序数组我们都切成了左中序数组和右中序数组了,那么后序数组就可以按照左中序数组的大小来切割,切成左后序数组和右后序数组。切割点在后序数组的最后一个元素,就是用这个元素来切割中序数组的,所以必要先切割中序数组。此时,中序数组切成了左中序数组和右中序数组,后序数组切割成左后序数组和右后序数组。第五步:切割后序数组,切成后序左数组和后序右数组。原创 2023-12-27 11:18:59 · 853 阅读 · 0 评论 -
113. 路径总和 II
给你二叉树的根节点 和一个整数目标和 ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。示例 1:输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22输出:[[5,4,11,2],[5,8,4,5]]示例 2:输入:root = [1,2,3], targetSum = 5输出:[]示例 3:输入:root = [1,2], targetSum = 0输出:[]原创 2023-12-24 14:34:32 · 362 阅读 · 0 评论 -
112. 路径总和
给你二叉树的根节点root和一个表示目标和的整数targetSum。判断该树中是否存在的路径,这条路径上所有节点值相加等于目标和targetSum。如果存在,返回true;否则,返回false。是指没有子节点的节点。true等于目标和的根节点到叶节点路径如上图所示。false树中存在两条根节点到叶子节点的路径:(1 --> 2): 和为 3(1 --> 3): 和为 4不存在 sum = 5 的根节点到叶子节点的路径。false由于树是空的,所以不存在根节点到叶子节点的路径。原创 2023-12-24 14:01:56 · 800 阅读 · 0 评论 -
513. 找树左下角的值
找到。原创 2023-12-24 12:33:38 · 341 阅读 · 0 评论 -
404. 左叶子之和
递归的时候参数就是当前节点,终止条件就是熟悉的节点为空跳出,求和的时候需要判断是否为左叶子,就用当前节点左节点是否为空,并且这个左节点的左右均为空才能为左叶子,这时把result更新,接下来要进行递归,继续去遍历 当前节点的左右节点。我这里构造了一个班辅助函数用于求和,无返回值,直接在外面定义了result用于存取结果,在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24。首先本道题求左叶子的和,千万别求成左节点的和,叶子一定是左右均为空。,返回所有左叶子之和。原创 2023-12-24 11:55:54 · 326 阅读 · 0 评论 -
257. 二叉树的所有路径
至于非递归的方式,我们可以依然可以使用前序遍历的迭代方式来模拟遍历路径的过程,这里除了模拟递归需要一个栈,同时还需要一个栈来存放对应的遍历路径。然后是递归和回溯的过程,上面说过没有判断cur是否为空,那么在这里递归的时候,如果为空就不进行下一层递归了。这道题目要求从根节点到叶子的路径,所以需要前序遍历,这样才方便让父节点指向孩子节点,找到对应的路径。此时还没完,递归完,要做回溯啊,因为path 不能一直加入节点,它还要删节点,然后才能加入新的节点。所以递归前要加上判断语句,下面要递归的节点是否为空,如下。原创 2023-12-23 13:50:20 · 1044 阅读 · 0 评论 -
110. 平衡二叉树
给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1。truefalseroot = []true[0, 5000]但leetcode中强调的深度和高度很明显是按照节点来计算的,如图:关于根节点的深度究竟是1 还是 0,不同的地方有不一样的标准,leetcode的题目中都是以节点为一度,即根节点深度是1。原创 2023-12-23 12:51:04 · 872 阅读 · 0 评论 -
222. 完全二叉树的节点个数
我来举一个典型的例子如题:完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。对于情况一,可以直接用 2^树深度 - 1 来计算,注意这里根节点深度为1。对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。完全二叉树(一)如图:完全二叉树(二)如图:可以看出如果整个树不是满二叉树,就递归其左右孩子,直到遇到满二叉树为止,用公式计算这个子树(满二叉树)的节点数量。原创 2023-12-21 16:05:33 · 845 阅读 · 0 评论 -
559. N 叉树的最大深度
N 叉树输入按层序遍历序列化表示,每组子节点由空值分隔(请参见示例)。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。给定一个 N 叉树,找到其最大深度。原创 2023-12-21 14:27:16 · 340 阅读 · 0 评论 -
572. 另一棵树的子树
由于需要利用一棵树的子树去判断,需要用子树的一部分去递归,因此需要构造辅助函数,这个辅助函数参数就是两个子树,这个函数就是为了判断这两棵子树是否相等,随后主函数则是进行不断调用辅助函数,传参的时候就不断地用根节点,根节点左孩子,根节点右孩子不断去判断,这三个满足一个即可,用或连接。具有相同结构和节点值的子树。的某个节点和这个节点的所有后代节点。也可以看做它自身的一棵子树。原创 2023-12-20 22:41:41 · 343 阅读 · 0 评论 -
对称性递归(思路分析+解题模板)
这一类题目有两种情况:第一种是单树问题,且不需要用到子树的某一部分(比如根节点左子树的右子树),只要利用根节点左右子树的对称性即可进行递归。就是对一个对称的数据结构(这里指二叉树)从整体的对称性思考,把大问题分解成子问题进行递归,即不是单独考虑一部分(比如树的左子树),而是同时考虑对称的两部分(左右子树),从而写出对称性的递归代码。力扣上很多树的题目都是可以用递归很快地解决的,而这一系列递归解法中蕴含了一种很强大的递归思维:对称性递归(symmetric recursion)572. 另一个树的子树。原创 2023-12-20 22:32:22 · 384 阅读 · 0 评论 -
100. 相同的树
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。总之就是把判断两棵树的节点是否一样,和对称二叉树一样的方法。,编写一个函数来检验这两棵树是否相同。给你两棵二叉树的根节点。与这篇文章方法基本一样。还是一个后序遍历的方式。原创 2023-12-20 22:17:51 · 353 阅读 · 0 评论 -
101. 对称二叉树
给你一个二叉树的根节点root, 检查它是否轴对称。truefalse[1, 1000]对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了,所以在递归遍历的过程中,也是要同时遍历两棵树。那么如何比较呢?比较的是两个子树的里侧和外侧的元素是否相等。如图所示:那么遍历的顺序应该是什么样的呢?本题遍历只能是“后序遍历”,因为我们要通过递归函数的返回值来判断两个子树的内侧节点和外侧节点是否相等。原创 2023-12-18 23:10:17 · 875 阅读 · 0 评论 -
226. 翻转二叉树
给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。[2,3,1]root = [][][0, 100]我们之前介绍的都是各种方式遍历二叉树,这次要翻转了,感觉还是有点懵逼。这得怎么翻转呢?如果要从整个树来看,翻转还真的挺复杂,整个树以中间分割线进行翻转,如图:可以发现想要翻转它,其实就把每一个节点的左右孩子交换一下就可以了。关键在于遍历顺序,前中后序应该选哪一种遍历顺序?(一些同学这道题都过了,但是不知道自己用的是什么顺序)原创 2023-12-17 14:59:14 · 885 阅读 · 0 评论 -
111. 二叉树的最小深度
给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。叶子节点是指没有子节点的节点。25[0, 105]原创 2023-12-17 13:46:26 · 367 阅读 · 0 评论 -
104. 二叉树的最大深度
是指从根节点到最远叶子节点的最长路径上的节点数。可以继续使用层序遍历法,累加层数。原创 2023-12-17 13:36:55 · 344 阅读 · 0 评论 -
117. 填充每个节点的下一个右侧节点指针 II
给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化输出按层序遍历顺序(由 next 指针连接),'#' 表示每层的末尾。填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为。初始状态下,所有 next 指针都被设置为。原创 2023-12-17 13:21:28 · 360 阅读 · 0 评论 -
116. 填充每个节点的下一个右侧节点指针
依旧用层序遍历模板,队列大小为每一层大小,先弹出的数据保存好,由于弹出来了,因此这个数据的next便是队列的头节点,正好赋值,但要注意每层的最后一个,如果到达最后一个节点,则不要赋值了,因为此时队列弹出数据,头节点则变成下一层数据了。给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化的输出按层序遍历排列,同一层节点由 next 指针连接,'#' 标志着每一层的结束。,其所有叶子节点都在同一层,每个父节点都有两个子节点。原创 2023-12-17 13:18:28 · 358 阅读 · 0 评论 -
515. 在每个树行中找最大值
请找出该二叉树中每一层的最大值。层序遍历,取每一层的最大值。给定一棵二叉树的根节点。最小值:INT_MIN。原创 2023-12-17 12:51:34 · 347 阅读 · 0 评论 -
429. N 叉树的层序遍历
树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。这道题依旧是模板题,只不过一个节点有多个孩子了。给定一个 N 叉树,返回其节点值的。(即从左到右,逐层遍历)。原创 2023-12-17 12:36:05 · 325 阅读 · 0 评论 -
637. 二叉树的层平均值
第 0 层的平均值为 3,第 1 层的平均值为 14.5,第 2 层的平均值为 11。, 以数组的形式返回每一层节点的平均值。本题就是层序遍历的时候把一层求个总和在取一个均值。因此返回 [3, 14.5, 11]。给定一个非空二叉树的根节点。以内的答案可以被接受。原创 2023-12-17 12:25:44 · 351 阅读 · 0 评论 -
199. 二叉树的右视图
不要想的很复杂,每次都去找右节点,右节点没有则找左节点,容易把自己绕进去。实际上还是可以引用层序遍历模板,所谓右视图,就是每层的最后一个元素(最右边) ,层序遍历的时候,判断是否遍历到单层的最后面的元素,如果是,就放进result数组中,随后返回result就可以了。,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。队列的size就是每层的元素个数。原创 2023-12-17 12:04:20 · 315 阅读 · 0 评论 -
107. 二叉树的层序遍历 II
(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)把最后的结果数组反转即可。原创 2023-12-17 10:53:06 · 346 阅读 · 0 评论 -
102. 二叉树的层序遍历
层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。(即逐层地,从左到右访问所有节点)。需要借用一个辅助数据结构即队列来实现,这样就实现了层序从左到右遍历二叉树。原创 2023-12-17 10:40:47 · 353 阅读 · 0 评论 -
二叉树的统一迭代法
实践过的同学,也会发现使用迭代法实现先中后序遍历,很难写出统一的代码,不像是递归法,实现了其中的一种遍历方式,其他两种只要稍稍改一下节点顺序就可以了。可以看出我们将访问的节点直接加入到栈中,但如果是处理的节点则后面放入一个空节点, 这样只有空节点弹出的时候,才将下一个节点放进结果集。动画中,result数组就是最终结果集。我们以中序遍历为例,在使用栈的话,这种方法也可以叫做标记法。原创 2023-12-17 09:51:48 · 409 阅读 · 0 评论