leetcode二叉树系列
leetcode二叉树系列
谜底666
我迷恋的时光自天空倾倒
展开
-
leetcode124 二叉树中的最大路径和-dfs
二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次。该路径 至少包含一个 节点,且不一定经过根节点。解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42。输入:root = [-10,9,20,null,null,15,7]给你一个二叉树的根节点 root ,返回其 最大路径和。路径和 是路径中各节点值的总和。原创 2024-05-23 08:32:28 · 375 阅读 · 0 评论 -
leetcode437 路径总和III-哈希表+前缀和
给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。输入:root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8。路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。解释:和等于 8 的路径有 3 条,如图所示。原创 2024-05-21 09:24:19 · 393 阅读 · 0 评论 -
leetcode230 二叉搜索树中第K小的元素
给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。这道题应该是能做出来的,首先二叉搜索树的中序遍历是递增的,那就在此基础上直接数K个树就好了。输入:root = [5,3,6,2,4,null,null,1], k = 3。原创 2024-05-21 08:07:09 · 342 阅读 · 0 评论 -
leetcode103 二叉树的锯齿形层序遍历
给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。这道题就是在二叉树层序遍历的基础上,需要能判断出来是偶数层(加个标识),然后偶数层就进行反转(需要自己实现一个反转函数)输入:root = [3,9,20,null,null,15,7]输出:[[3],[20,9],[15,7]]原创 2024-04-17 08:53:45 · 270 阅读 · 1 评论 -
leetcode199 二叉树的右视图
上面的代码再解释下,因为递归先遍历的时右子树,在根节点的时候,深度为0,结果集的长度也为0,所以把根节点的值加入结果集;加一个depth参数就可以。还有一种更为巧妙的方法是,使用递归法,先递归右子树,再递归左子树,同时在递归的时候在多传一个参数是二叉树的深度,当深度等于答案结果集的长度时,就将此时递归到的节点追加到答案中。给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。输入: [1,2,3,null,5,null,4]输出: [1,3,4]原创 2024-04-16 07:39:55 · 282 阅读 · 0 评论 -
leetcode二叉树系列通用输入定义
日常我们在leetcode上刷题的时候,都是核心代码模式,并不知道如何构造参数,以及自己写输入输出调试的时候该如何处理,在这里进行一个整理。原创 2023-10-24 08:48:03 · 212 阅读 · 0 评论 -
leetcode二叉树系列参数构造
【代码】leetcode二叉树系列参数构造。原创 2023-10-18 21:03:54 · 138 阅读 · 0 评论 -
leetcode543 二叉树的直径
二叉树的 直径 是指树中任意两个节点之间最长路径的 长度。这道题竟然标的是简单。也没那么简单吧,官方题解的那个视频将的比较好,想不明白了可以去看下视频。而每个节点的对应的直径是:左子树的深度 + 右子树的深度,所以节点1的直径就是3。要去求最大的啥啥啥,首先就得考虑设置一个变量来存最大值,这个是经常用到的思路。4的深度是1,5的深度是1,2的深度是2,3的深度是1,1的深度是最大值2。解释:3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。给你一棵二叉树的根节点,返回该树的 直径。原创 2023-09-22 09:02:14 · 106 阅读 · 0 评论 -
leetcode297 二叉树的序列化与反序列化
这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。本题使用的方法为深度优先搜索dfs,然后使用前序遍历,序列化的使用将空节点用null存到字符串中,然后逗号分割拼成一个字符串;输入:root = [1,2,3,null,null,4,5]原创 2023-09-21 18:22:01 · 142 阅读 · 0 评论 -
leetcode114 二叉树展开为链表
这道题的题目中已经描述比较清晰了,告诉了和前序遍历相同,那么就意味先来一遍前序遍历,将遍历后的结果存起来,这里需要注意一下,之前是存到了一个[]int{}结构里,因为之前返回的是一个int数组,而这次要返回链表,所以要提前定义一个[]*TreeNode{}的结构,前序遍历完得到这个结构后,再来一个循环遍历这个数组,同时遍历这个数组的两个节点,将每个节点的left置为nil,right指向下一个节点就可以了。输出:[1,null,2,null,3,null,4,null,5,null,6]原创 2023-09-21 17:11:51 · 325 阅读 · 0 评论 -
leetcode二叉树系列汇总
二叉树系列,首先必须要掌握的就是四种遍历方式:前、中、后、层次;每种遍历方式,都需要知道可以用递归和迭代法来解;前序:根左右中序:左根右后序:左右根层次:从上到下每一层(这个可以去记迭代法)然后写递归代码思路的遍历顺序和上述规则是一样的;而迭代法,以前序遍历为基础来进行解释的话:相当于维护了一个栈,压入的时候,先压入根节点,再压入右节点,在左节点(这样弹出的时候就是先弹左,再弹右了)所以迭代法中,写代码的时候,压入栈的规则是:前序:根右左后序:根左右后再整体反转。原创 2023-03-08 08:32:03 · 291 阅读 · 0 评论 -
leetcode 538 把二叉搜索树转换为累加树
给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]同时遍历的时候还是需要一个prev来存上一个节点的值,因为这次只要值且需要累加,存int就可以了。原创 2022-11-15 09:41:18 · 310 阅读 · 0 评论 -
leetcode 108 将有序数组转换为二叉搜索树
高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵。解释:[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。注意取数组的中间节点的话,可以用防溢出的那种方法,在这里就懒得写了;这种题目大概率都是递归,迭代法太麻烦了;输入:nums = [1,3]然后就是左右两边分别递归构造。原创 2022-11-15 09:12:53 · 133 阅读 · 0 评论 -
leetcode 669 修剪二叉搜索树
给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。首先可以想到递归,由于是二叉搜索树,比如递归到某个节点的时候,值小于最小值,这时还需要去判断该节点的右子树是否小于该值(二叉搜索树的特性);所以结果应当返回修剪好的二叉搜索树的新的根节点。输入:root = [1,0,2], low = 1, high = 2。原创 2022-11-15 08:51:38 · 138 阅读 · 0 评论 -
leetcode 450 删除二叉搜索树中的节点
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一个正确的答案是 [5,4,6,2,null,null,7], 另一个正确答案是 [5,2,6,null,4,null,7]。解释:给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。输入:root = [5,3,6,2,4,null,7], key = 3。输出:[5,4,6,2,null,null,7]原创 2022-11-14 09:50:15 · 52 阅读 · 0 评论 -
leetcode 701 二叉搜索树中的插入操作
给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。返回插入后二叉搜索树的根节点。输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。注意这道题首先结果不唯一,其次是最后只要还是一棵二叉搜索树就行;这就意味着不需要复杂的左旋右旋来调整树结构(那是平衡二叉树);注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。你可以返回 任意有效的结果。输入:root = [4,2,7,1,3], val = 5。输出:[4,2,7,1,3,5]原创 2022-11-14 09:17:17 · 49 阅读 · 0 评论 -
leetcode 235 二叉搜索树的最近公共祖先
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。和上一道二叉树的题相比,这一道因为二叉搜索树是有序的,只需要向一个方向寻找就可以了。输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8。给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。解释: 节点 2 和节点 8 的最近公共祖先是 6。原创 2022-11-11 09:24:40 · 329 阅读 · 0 评论 -
leetcode 236 二叉树的最近公共祖先
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1。给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。解释:节点 5 和节点 1 的最近公共祖先是节点 3。原创 2022-11-11 09:02:23 · 302 阅读 · 0 评论 -
leetcode 501 二叉搜索树中的众数
给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。如果树中有不止一个众数,可以按 任意顺序 返回。输入:root = [1,null,2,2]用递归法中序:左中右。原创 2022-11-09 23:31:26 · 152 阅读 · 0 评论 -
leetcode 530 二叉搜索树的最小绝对差
注意递归函数中,传了res的指针,定义再函数里,然后返回是不行的,会不断被重复初始化;给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值。差值是一个正数,其数值等于两值之差的绝对值。输入:root = [4,2,6,1,3]原创 2022-11-08 09:31:33 · 222 阅读 · 0 评论 -
leetcode 98 验证二叉搜索树
首先使用递归法的话,得先定义最大值和最小值(int64),每次递归的话,判断子树中所有节点的值是否都在 (l,r) 的范围内(注意是开区间);同时,在递归调用左子树时,我们需要把上界改为 root.val,递归右子树同理。给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。输入:root = [5,1,4,null,null,3,6]解释:根节点的值是 5 ,但是右子节点的值是 4。节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。原创 2022-11-05 21:51:46 · 173 阅读 · 0 评论 -
leetcode 700 二叉搜索树中的搜索
你需要在 BST 中找到节点值等于 val 的节点。返回以该节点为根的子树。如果节点不存在,则返回 null。首先注意本题是二叉搜索树,即有序的(之前的都是乱序的),这样其实就有点二分查找的意思了。给定二叉搜索树(BST)的根节点 root 和一个整数值 val。输入:root = [4,2,7,1,3], val = 2。至于迭代法也比较简单,暴力解就可以。输出:[2,1,3]原创 2022-11-05 20:45:56 · 108 阅读 · 0 评论 -
leetcode 617 合并二叉树
想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。这道题为了节省空间,可以选择将第二棵树合并到第一课树上,当然也可以新开一棵树;输入:root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7]输出:[3,4,5,5,4,null,7]返回合并后的二叉树。原创 2022-11-05 19:36:42 · 96 阅读 · 0 评论 -
leetcode 654 最大二叉树
这道题和上一道(中序和后序构建二叉树),原理上十分类似,都是递归构造,这个甚至更简单一点,定位到中间节点后再分左右就好了。给定一个不重复的整数数组 nums。输出:[6,3,5,null,2,0,null,null,1]递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右子树。创建一个根节点,其值为 nums 中的最大值。输入:nums = [3,2,1,6,0,5]返回 nums 构建的 最大二叉树。原创 2022-11-02 09:05:44 · 119 阅读 · 0 评论 -
leetcode 106 从中序与后序遍历序列构造二叉树
给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树。已知后序遍历的最后一个值为根节点(左右根),而中序遍历是左根右,那么后序的最后一个节点就是中序的中间节点,以此来分割(注意光找到值不行,要找到索引值)输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]输出:[3,9,20,null,null,15,7]原创 2022-11-01 09:10:38 · 158 阅读 · 0 评论 -
leetcode 113 路径总和II
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22。这道题理论上和上一道的原理是一样的,还是递归+回溯,只不过要把每个结果存起来。输出:[[5,4,11,2],[5,8,4,5]]最下面那两行的回溯还是加不加都是结果正确,困惑。叶子节点 是指没有子节点的节点。原创 2022-10-30 21:29:09 · 63 阅读 · 0 评论 -
leetcode 112 路径总和
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum。如果存在,返回 true;否则,返回 false。输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22。但是这个到底算前序还是后序啊,有点搞不清了;因为用到了回溯,就只写递归法了,先不写迭代了。叶子节点 是指没有子节点的节点。原创 2022-10-30 20:26:15 · 90 阅读 · 0 评论 -
leetcode 513 找树左下角的值
给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。输入: root = [2,1,3]假设二叉树中至少有一个节点。这个迭代法最简单了,后序遍历。原创 2022-10-30 17:43:28 · 58 阅读 · 0 评论 -
leetcode 404左叶子之和
首先需要判断什么是左叶子:即一个节点,左子节点有值,左子节点的左子节点为nil,左子节点的右子节点为nil,则该左节点符合条件。解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24。输入: root = [3,9,20,null,null,15,7]给定二叉树的根节点 root ,返回所有左叶子之和。原创 2022-10-30 17:21:11 · 99 阅读 · 0 评论 -
leetcode 257 二叉树的所有路径
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。上面的递归(DFS)法其实还没理解太明白,迭代法先不写了,后面再看。输入:root = [1,2,3,null,5]求路径(求高度),因此需要前序遍历,即根左右;输出:[“1->2->5”,“1->3”]叶子节点 是指没有子节点的节点。原创 2022-10-30 16:37:07 · 51 阅读 · 0 评论 -
leetcode 110 平衡二叉树
本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。注意go中没有max,没有abs,没有三元表达式,在实际的代码开发中,可以写一个相关的配置文件。输入:root = [3,9,20,null,null,15,7]这道题使用迭代法的话,会很复杂,在这里只写递归法了。给定一个二叉树,判断它是否是高度平衡的二叉树。1.递归参数和返回值。原创 2022-10-26 09:08:12 · 150 阅读 · 0 评论 -
leetcode 222 完全二叉树的节点个数
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。迭代法:还是从二叉树的层序遍历,也没有什么要注意的地方,遍历了就行。给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。输入:root = [1,2,3,4,5,6]原创 2022-10-25 09:20:41 · 382 阅读 · 0 评论 -
leetcode 111 二叉树的最小深度
输入:root = [3,9,20,null,null,15,7]最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。给定一个二叉树,找出其最小深度。原创 2022-10-24 22:53:11 · 202 阅读 · 0 评论 -
leetcode 104 二叉树的最大深度
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。给定一个二叉树,找出其最大深度。这个就不用示例了把【狗头】原创 2022-10-18 08:43:52 · 188 阅读 · 0 评论 -
leetcode 101 对称二叉树
这道题依然是有递归法和迭代法,比较方法是左节点的左节点 和 右节点的右节点来进行比较,以此类推。给你一个二叉树的根节点 root , 检查它是否轴对称。输入:root = [1,2,2,3,4,4,3]迭代法:也比较好理解。原创 2022-10-18 08:04:09 · 185 阅读 · 0 评论 -
leetcode 226 翻转二叉树
首先这道题,要求返回的是根节点,(之前的前中后序遍历返回的都是一个新数组);这道题翻转的话,遍历交换左右子节点就可以(前序、后序、层次都可以)总结:这道题其实用啥方法都不太重要,感觉只要能遍历走完这棵树,有左右节点的交换一下,最后就可以了。给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。输入:root = [4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]原创 2022-10-17 08:46:52 · 200 阅读 · 0 评论 -
leetcode 102 二叉树的层序遍历
给你二叉树的根节点 root ,返回其节点值的 层序遍历。(即逐层地,从左到右访问所有节点)。输入:root = [3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]原创 2022-10-14 09:13:23 · 66 阅读 · 0 评论 -
leetcode 145 二叉树的后序遍历
给定一个二叉树的根节点 root ,返回 它的 后序 遍历。输入:root = [1,null,2,3]输出:[3,2,1]原创 2022-10-06 21:58:46 · 212 阅读 · 0 评论 -
leetcode 94 二叉树的中序遍历
给定一个二叉树的根节点 root ,返回 它的 中序 遍历。输入:root = [1,null,2,3]输出:[1,3,2]原创 2022-10-06 21:48:37 · 194 阅读 · 0 评论 -
leetcode 144 二叉树的前序遍历
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。输入:root = [1,null,2,3]输出:[1,2,3]原创 2022-10-06 21:04:09 · 233 阅读 · 0 评论