717 字
4 分钟
二叉树中的最大路径和

题目描述
二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 root
,返回其 最大路径和 。
解题思路
- 递归分治策略:
- 后序遍历二叉树(左→右→根)
- 对每个节点计算其作为路径根的最大路径和
- 返回该节点对父节点的最大贡献值
- 路径类型处理:
- 路径可能包含当前节点 + 左分支
- 路径可能包含当前节点 + 右分支
- 路径可能包含左分支 + 当前节点 + 右分支(全局路径)
- 贡献值传递:
- 节点对父节点的贡献 = 节点值 + max(左贡献, 右贡献)
- 负贡献值视为0(不选择该分支)
- 全局最大值更新:
- 每次计算包含当前节点的完整路径和
- 更新全局最大路径和
关键洞察
- 路径组合多样性:
- 最大路径可能不经过根节点
- 需考虑所有可能的路径组合形式
- 贡献值概念:
- 节点贡献值只能包含单边分支(左或右)
- 完整路径计算需独立于贡献值传递
- 负值剪枝:
- 舍弃负贡献分支(贡献值取 max(0, 分支贡献))
- 避免负值降低路径和
- 后序优势:
- 先获取子树信息再计算当前节点
- 自然支持复杂路径组合计算
复杂度分析
指标 | 说明 |
---|---|
时间复杂度 | O(n):每个节点访问一次 |
空间复杂度 | O(h):递归栈深度(h为树高,最坏O(n)) |
代码实现
/** * Definition for a binary tree node. * function TreeNode(val, left, right) { * this.val = (val===undefined ? 0 : val) * this.left = (left===undefined ? null : left) * this.right = (right===undefined ? null : right) * } *//** * @param {TreeNode} root * @return {number} */var maxPathSum = function (root) { let result = -Infinity;
const dfs = (root) => { if (!root) return 0; const left = Math.max(dfs(root.left), 0); const right = Math.max(dfs(root.right), 0); const max = left + right + root.val; result = Math.max(result, max); return Math.max(left, right) + root.val }
dfs(root);
return result;};
实际应用场景
- 网络流量优化:通信网络中寻找最大数据传输路径`
- 社交网络分析:影响力传播树中寻找最大影响路径`
- 生物信息学:基因树中寻找最优匹配路径`
- 游戏开发:决策树中寻找最高得分路径`