[HOT 100] 0124. 二叉树中的最大路径和
文章目录
- 1. 题目链接
- 2. 题目描述
- 3. 题目示例
- 4. 解题思路
- 5. 题解代码
- 6. 复杂度分析
1. 题目链接
124. 二叉树中的最大路径和 - 力扣(LeetCode)
2. 题目描述
二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 root
,返回其 最大路径和 。
3. 题目示例
示例 1 :
输入:root = [1,2,3]
输出:6
解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6
示例 2 :
输入:root = [-10,9,20,null,null,15,7]
输出:42
解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42
4. 解题思路
- 问题理解:
- 需要找到二叉树中任意节点到任意节点的路径,使路径上节点和最大
- 路径至少包含一个节点
- 路径可以不经过根节点
- 关键思路:
- 后序遍历计算每个节点的最大贡献值
- 对于每个节点,计算其作为路径最高点时的路径和
- 维护全局最大值
- 递归设计:
- 基本情况:空节点贡献值为0
- 递归计算左右子树贡献值(负值则舍弃)
- 更新全局最大值(当前节点作为转折点的路径和)
- 返回当前子树的最大贡献值
- 贡献值与路径和:
- 节点贡献值:该节点到其子树中某节点的最大路径和
- 全局最大路径和:所有可能路径中的最大值
5. 题解代码
class Solution {private int ans = Integer.MIN_VALUE; // 存储最终结果(最大路径和)public int maxPathSum(TreeNode root) {dfs(root); // 从根节点开始深度优先搜索return ans; // 返回最大路径和}private int dfs(TreeNode node) {if (node == null) {return 0; // 空节点贡献值为0}// 递归计算左子树的最大贡献值(如果为负则不计入)int lVal = Math.max(dfs(node.left), 0);// 递归计算右子树的最大贡献值(如果为负则不计入)int rVal = Math.max(dfs(node.right), 0);// 更新全局最大值(当前节点作为路径最高点的路径和)ans = Math.max(ans, lVal + rVal + node.val);// 返回当前子树的最大贡献值(只能选择左右子树中的一个路径)return Math.max(lVal, rVal) + node.val;}
}
6. 复杂度分析
时间复杂度:O(n)
- 每个节点只访问一次
- n为树中节点数量
空间复杂度:O(h)
- 递归调用栈深度
- h为树的高度(最坏情况O(n),平衡树O(logn))