首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

LeetCode 实战:「图解」二叉树最大路径

题目描述 给定一个非空二叉树,返回其最大路径。 本题中路径被定义为一条从树中任意节点出发,达到任意节点序列。该路径 至少包含一个节点 ,且不一定经过根节点。.../ \ 15 7 输出: 42 题目分析 这是一道二叉树题中比较难题目。...题目要求出一个二叉树最大路径路径就是把一条路径上面节点值加起来,这一题难点在于路径方向不固定,只要是任意两点间通路都算是有效路径。...我们再回过头来看这道题,在递归遍历过程中,对于当前节点,其在路径中可以是路径尾,路径头(假设路径是从上到下,其实在这道题中,没有头尾概念),也可以是路径一个节点。 那怎么判断呢?...表示左子树到 root 最大和路径,right 表示右子树到 root 最大和路径: root 左右路径形成路径(left - root - right) root 路径形成路径(left

69230
您找到你想要的搜索结果了吗?
是的
没有找到

二叉树刷题总结:二叉树属性

可以看出, 求二叉树最小深度二叉树最大深度差别主要在于处理左右孩子不为空逻辑。...本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 左右两个子树高度差绝对值不超过1。 思路 既然是要求比较高度,则我们可以用到后序遍历方式。...确定递归参数返回值,参数为传入根节点,记录每条路径节点值数组path,以及路径结果数组res; 当遇到叶子节点时候终止,并将路径节点值数组里数值转换成字符串,然后加入到结果数组; 递归单层逻辑为...思路 利用递归来解答此题: 确定递归函数传参返回值:参数为传入根节点计数变量,该计数变量每次递归时候需要减去当前节点值,最后遇到叶子节点时候判断该叶子节点值是否与它一致,如果一致,则表示找到了该路径...2 给定一个二叉树一个目标,找到所有从根节点到叶子节点路径总和等于给定目标路径

30110

填充每个节点下一个右侧节点指针

使用递归解题也符合要求,本题中递归程序占用栈空间不算做额外空间复杂度。...输入:root = [1,2,3,4,5,6,7] 输出:[1,#,2,3,#,4,5,6,7,#] 解释:给定二叉树如图 A 所示,你函数应该填充它每个 next 指针,以指向其下一个右侧节点...序列化输出按层序遍历排列,同一层节点由 next 指针连接,’#’ 标志着每一层结束 完美二叉树,指的是整棵二叉树是一个正三角形,除了最右侧节点next指针会指向null,其他节点右侧一定有相邻节点...root.left.next = root.right; connect(root.left); connect(root.right); return root; } 这个是错误思想...,具体详见下图: 节点 5 节点 6 不属于同一个父节点,那么按照这段代码逻辑,它俩就没办法被穿起来,这是不符合题意

26820

一天一大 leet(不同二叉搜索树 II)难度:中等-Day20200721

,只是之前只需要输出种类数,本题需要输出二叉树 回顾下不同二叉搜索树那道题中逻辑: 使用指针 i 将数字切分左右分段 dp[i]存放指针在 i 时存在所有可能二叉树数量 左右二叉树种类数相乘 那将该逻辑向本题靠下试下...: 对数字分段逻辑可以沿用 dp 就不能只存放数量了,需要存放二叉树(其实这个逻辑还是好实现[TreeNode()]) 遍历 i 左右二叉树时就会发现,不仅要多左侧已经生成二叉树集合做增加节点操作...(i) - treeRight (其中 treeLeft、treeRight 均为在指定范围生成新二叉树,不存在追加节点删除节点问题) 如果这个范围是 1 到 n,这时逻辑回归了题目的逻辑递归走起...~ 递归逻辑就只剩问题 2 没有解决了: 将要插入元素生成节点 循环原有树集合(通过指定范围递归生成), 将左侧生成树拼接到新树 left,右侧拼接到 right [1,null,2,null...,3],在二叉树中应该[1,2,null,3,null]不是相同吗?

24820

java算法刷题02——深度优先搜索与广度优先搜索

如本题中,我们递归求解左、右子树深度,如果一个节点没有左、右子树了,其深度仍然可以求:为1,仍属于递归求解范围,因此递归跳出条件是一个节点为null。 2.递归返回类型是什么?...因为下一次递归依赖上一次递归返回结果,因此递归返回结果一定是需要在多次递归中需要被传递值。比如该题中我们返回不是这个树是否是平衡二叉树,而是树深度。 3.递归核心计算是什么?...比如本题中,核心计算就是求树深度,怎么做到呢?左、右子树最大深度加1. 如果可以用这样逻辑去思考递归算法,后续做题就更加简单了。 除了深度优先搜索遍历,广度优先搜索也常常应用于树算法问题。...核心操作,可能是输出,可能是改值,本题中就是改值 3.递归进行dfs(本题等数组递归条件是上下左右移动,而二叉树一般是结点左右孩子节点递归)。...4.递归返回(有时候操作需要返回值给下一次递归,比如求二叉树深度) T7.省份数量 怎么样?您是不是已经跃跃欲试了,下面我们套用上面的思考逻辑解决一道问题试试看。

55010

二叉树前序遍历 、二叉树最大深度、平衡二叉树二叉树遍历【LeetCode刷题日志】

它首先将当前节点值存储在数组a中,然后递归地遍历左子树右子树。注意,这里直接使用了全局变量i来更新数组索引。...接下来,它递归地遍历左子树右子树。...二叉树 最大深度 是指从根节点到最远叶子节点最长路径节点数。 /** * Definition for a binary tree node....本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 左右两个子树高度差绝对值不超过 1 。 /** * Definition for a binary tree node....例如如下先序遍历字符串: ABC##DE#G##F### 其中“#”表示是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。

10610

DFS(深度优先遍历)

DFS通常使用栈或递归来实现,其中递归实现更为常见直观。 关系: 回溯法通常使用DFS作为其基本搜索策略。在回溯法中,DFS用于系统地遍历所有可能解空间。...在排列型问题中,DFS用于生成所有可能排列,而在子集型问题中,它用于生成所有可能子集。 尽管在很多情况下回溯法DFS是紧密相关,但它们并不总是等价。...前序遍历是二叉树深度优先遍历一种形式。 前序遍历顺序:在二叉树前序遍历中,我们首先访问当前节点(根节点或任意子树根),然后递归地前序遍历左子树,最后递归地前序遍历右子树。...在树中,这意味着沿着树最深路径进行搜索,直到到达叶节点或无法再深入,然后回溯到开始搜索路径下一个节点。 在二叉树前序遍历中,每个节点被访问顺序实际上反映了DFS搜索树方式。...输入描述: 输入包含一个正整数 N(N <= 10),表示棋盘大小需要放置皇后数量。 输出描述: 输出一个正整数,表示在给定大小棋盘上放置 N 个皇后合法方法数量。

8310

☆打卡算法☆LeetCode 129. 求根节点到叶节点数字之和 算法解析

示例 1: 输入:root = [1,2,3] 输出:25 解释: 从根到叶子节点路径 1->2 代表数字 12 从根到叶子节点路径 1->3 代表数字 13 因此,数字总和 = 12 + 13 = 25...示例 2: 输入:root = [4,9,0,5,1] 输出:1026 解释: 从根到叶子节点路径 4->9->5 代表数字 495 从根到叶子节点路径 4->9->1 代表数字 491 从根到叶子节点路径...4->0 代表数字 40 因此,数字总和 = 495 + 491 + 40 = 1026 二、解题 1、思路分析 这道题中二叉树每个从根节点到子节点路径都代表一个数字,也就是每个节点对应一个数字...空间复杂度:O(n) 其中n是二叉树节点个数,空间复杂度取决于递归调用栈空间,递归深度等于二叉树高度,最坏情况下,二叉树高度等于节点个数,也就是O(n)。...然后每次从两个队列中取出一个节点一个节点对应数字进行操作: 如果当前节点时子节点,则将该数字对应数字加到数字之和 如果当前节点不是子节点,则计算子节点对应数字,然后将子节点子节点对应数字加入到两个队列中

23320

Leetcode No.129 求根节点到叶节点数字之和

一、题目描述 给你一个二叉树根节点 root ,树中每个节点都存放有一个 0 到 9 之间数字。...示例 1: 输入:root = [1,2,3] 输出:25 解释: 从根到叶子节点路径 1->2 代表数字 12 从根到叶子节点路径 1->3 代表数字 13 因此,数字总和 = 12 +...13 = 25 示例 2: 输入:root = [4,9,0,5,1] 输出:1026 解释: 从根到叶子节点路径 4->9->5 代表数字 495 从根到叶子节点路径 4->9->1 代表数字...<= 9 树深度不超过 10 二、解题思路 这道题中二叉树每条从根节点到叶子节点路径都代表一个数字。...空间复杂度:O(n),其中 n 是二叉树节点个数。空间复杂度主要取决于递归调用栈空间,递归深度等于二叉树高度,最坏情况下,二叉树高度等于节点个数,空间复杂度为 O(n)。

17610

二叉树专项练习

二叉树最大深度 给定一个二叉树,找出其最大深度。 二叉树深度为根节点到最远叶子节点最长路径节点数。 说明: 叶子节点是指没有子节点节点。...平衡二叉树 给定一个二叉树,判断它是否是高度平衡二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 左右两个子树高度差绝对值不超过 1 。...,我本来想法是跟上题差不多 求根节点左子树 根节点右子树,但是后来我发现忽略了每个节点都要差一这个条件。...这道题也是使用了c语言求绝对值所使用 abs 只有满足该点左子树左子树相差小于2并且左子树与右子树本身递归也相差小于2才成立 递归展开图 三、二叉树遍历 编一个程序,读入用户输入一串先序遍历字符串...输出描述: 可能有多组测试数据,对于每组数据, 输出将输入字符串建立二叉树后中序遍历序列,每个字符后面都有一个空格。 每个输出结果占一行。

13410

二叉树遍历回顾

目录 写在前面 递归式遍历 先序遍历迭代版本 中序遍历迭代版本 后序遍历迭代版本 层次遍历 小结 参考 写在前面 本文重点在于复习并总结 二叉树每种遍历方式递归与迭代实现,图片示例代码均来自《...递归式遍历 二叉树可以递归地定义,根节点、左子树右子树,左右子树也可以分别是一棵二叉树。...通过先序、中序后序遍历,线性化得到序列分别为VLR、LVRLRV彻底展开,序列中每个局部也都符合先序、中序后序次序。 下面看一下,不同遍历迭代实现,在于洞察不同规则下访问路径特点。...因为输出是以LRV次序输出,所以入栈时需按VRL入栈,逆序记录沿途各节点及其右孩子左孩子,同时,需要判断,代码如下 template //在以S栈顶节点为根子树中,找到最高左侧可见叶节点..., 先序、中序后序遍历,是对VLR、LVRLRV完全展开 递归版本,使用同一模板实现,只是访问当前数据代码放置位置不同 迭代版本,三者均可以通过辅助栈实现,根据VLR、LVRLRV推导出遍历路径

54710

每日算法系列【LeetCode 124】二叉树最大路径

题目描述 给定一个非空二叉树,返回其最大路径。 本题中路径被定义为一条从树中任意节点出发,达到任意节点序列。该路径至少包含一个节点,且不一定经过根节点。...这题要求是一条路径路径数字之和要最大。我们采用递归来做这题,假设dfs(r)表示以 r 为根结点子树中最长路径,而左右子结点用 l r 来表示。 那么有人可能会说,这不是很简单了嘛。...其实是错,刚开始我也犯了这样错误(好久没做树形 dp 了,见笑了)。为什么是错呢?试想这么一种情况,万一左子树最优解是不经过左子结点的话,怎么与根结点连接起来呢?...很好办,只需要用一个全局变量,每次递归时候都更新一下最大值就行了,因为总有一个结点是最优路径所在子树根结点。 分析到这里,貌似都对了,但是还有问题吗?...而情况6会导致路径出现左右分叉,这也是不允许。所以递归最后更新时,只能用其他三种情况更新。 代码 c++ /** * Definition for a binary tree node.

58120

【一天一大 lee】完全二叉树节点个数 (难度:中等) - Day20201124

说明: 完全二叉树定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层节点都集中在该层最左边若干位置。...示例: 输入: 1 / \ 2 3 / \ / 4 5 6 输出: 6 抛砖引玉 在本题中按部就班遍历二叉树是一定可以统计出所有二叉树节点。...遍历二叉树还有深度优先遍历递归方案,鉴于本题要求传入二叉树返回二叉树节点数,则可以直接实现统计二叉树节点递归逻辑: 传入二叉子树 如果子树为空节点数为 0 如果子树存在左子树或右子树则节点数+1,...继续递归求左子树节点数右子树节点数 var countNodes = function(root) { if (root == null) return 0 return 1 + countNodes...(root.left) + countNodes(root.right) } 单独统计底层节点数 根据题目完全二叉树定义,知道二叉树层级,那么除了最后一层二叉树节点数其实是确定,那么这个问题就可以看出两个部分

40910

常见二叉树系统题解

文章目录 LeetCode 树定义 二叉树 N叉树 二叉树遍历 二叉树前序遍历 递归 迭代 二叉树中序遍历 递归 迭代 二叉树后序遍历 递归 迭代:利用辅助类 迭代:逆序输出 二叉树层次遍历 递归...二叉树最大宽度 二叉树直径 二叉树坡度 二叉树所有路径 二叉树最近公共祖先 最深叶节点最近公共祖先 路径 左叶子之和 路径总和 路径总和 II 路径总和 III 二叉树最大路径 求根到叶子节点数字之和...路径总和 给定一个二叉树一个目标,判断该树中是否存在根节点到叶子节点路径,这条路径上所有节点值相加等于目标。...II 路径总和 II 给定一个二叉树一个目标,找到所有从根节点到叶子节点路径总和等于给定目标路径。...二叉树最大路径 给定一个非空二叉树,返回其最大路径

15020

Leetcode No.110 平衡二叉树

一、题目描述 给定一个二叉树,判断它是否是高度平衡二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 左右两个子树高度差绝对值不超过 1 。...示例 3: 输入:root = [] 输出:true 提示: 树中节点数在范围 [0, 5000] 内 -10^4 <= Node.val <= 10^4 二、解题思路 这道题中平衡二叉树定义是...根据定义,一棵二叉树是平衡二叉树,当且仅当其所有子树也都是平衡二叉树,因此可以使用递归方式判断二叉树是不是平衡二叉树。...具体做法类似于二叉树前序遍历,即对于当前遍历到节点,首先计算左右子树高度,如果左右子树高度差是否不超过 1,再分别递归地遍历左右子节点,并判断左子树右子树是否平衡。...空间复杂度主要取决于递归调用层数,递归调用层数不会超过 n。

24820

二叉树最大路径

题目 给定一个非空二叉树,返回其最大路径。 本题中路径被定义为一条从树中任意节点出发,达到任意节点序列。该路径至少包含一个节点,且不一定经过根节点。...\ 9 20 / \ 15 7 输出: 42 题解 这道题是一个post-order-traversal变形题目。...我们很容易想到left最大路径right最大路径求完之后更新最终结果状态。这时候我们就会去思考递归子问题代码怎么去构造。...会发现面临两个关键问题: 递归需要记录下来左右子树经过根节点最大值,以便计算后面的父节点,对应代码即: return Math.max(leftSum, rightSum) + root.val; 递归还要记录下不经过根节点最大值...但是我们递归只能返回一个参数啊。怎么办呢?

99410

二叉树节点高度深度,你区分开了么?

题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 左右两个子树高度差绝对值不超过1。 示例 1: 给定二叉树 [3,9,20,null,null,15,7] 返回 true 。...这里强调一波概念: 二叉树节点深度:指从根节点到该节点最长简单路径条数。 二叉树节点高度:指从该节点到叶子节点最长简单路径条数。...,这才是真正求深度逻辑!...递归三步曲分析: 明确递归函数参数返回值 参数的话为传入节点指针,就没有其他参数需要传递了,返回值要返回传入节点为根节点树深度。 那么如何标记左右子树是否差值大于1呢。...0,表示当前节点为根节点树高度为0 代码如下: if (node == NULL) { return 0; } 明确单层递归逻辑 如何判断当前传入节点为根节点二叉树是否是平衡二叉树呢,当然是左子树高度右子树高度相差

5.8K40

还在玩耍你,该总结啦!(本周小结之二叉树

100.相同树 572.另一个树子树 「二叉树:我对称么?中递归迭代法只需要稍作修改其中一个树遍历顺序,便可刷了100.相同树。」...「而根节点高度就是二叉树最大深度」,所以本题中我们通过后序求根节点高度来求二叉树最大深度,所以二叉树:看看这些树最大深度中使用是后序遍历。...「求二叉树最小深度二叉树最大深度差别主要在于处理左右孩子不为空逻辑。」 注意到这一点之后 递归迭代法 都可以参照二叉树:看看这些树最大深度写出来。...二叉树节点深度:指从根节点到该节点最长简单路径条数。二叉树节点高度:指从该节点到叶子节点最长简单路径条数。 「但leetcode中强调深度高度很明显是按照节点来计算」。...周六 在二叉树:找我所有路径?中正式涉及到了回溯,很多同学过了这道题目,可能都不知道自己使用了回溯,其实回溯递归都是相伴相生。最后我依然给出了迭代法版本。

24220

递归遍历-LeetCode 124、112、113(递归遍历二叉树,回溯法)

【LeetCode #124 二叉树最大路径】 给定一个非空二叉树,返回其最大路径。 本题中路径被定义为一条从树中任意节点出发,达到任意节点序列。...示例 1: 输入: [1,2,3] 1 / \ 2 3 输出: 6 解题思路: 我们从根节点开始递归,最大值路径可能出现在左子树,右子树以及包含根节点左右子树三种情况...因此使用递归算法从根节点开始遍历,如果左右子树最大路径大于0,则取出该路径最大值,否则为零,也就是说如果大于零,则加上之后result是可以增加!...解题思路: 这是一个分治思路,求一个二叉树中存不存在某一个路径为sum,可以变换问题为: 对于一个节点root, 如果其左子树存在,则其左子树存不存在一个路径为sum-root->val, 如果其右子树存在...这里面需要注意一点就是回溯法使用,当修改了一个状态之后,递归结束后,需要把这个状态重新置为之前状态。 比如tmp中push_back了一个值,当递归结束进行回溯阶段,需要pop_back()。

87370
领券