leetcode124-二叉树中的最大路径和
leetcode 124
思路
一、问题拆解与核心逻辑
- 路径的两种形态
- 形态 1:路径经过当前节点,且向左右子树分叉(如左子树→当前节点→右子树)
- 形态 2:路径以当前节点为端点,向上延伸(如当前节点→左子树 或 当前节点→右子树)
- 递归的核心目标
对每个节点,计算以该节点为端点的最大路径和(用于向上传递给父节点)
同时,计算经过该节点的最大路径和(可能包含左右子树的分叉路径),并更新全局最大值
二、递归函数的设计
- 函数定义
deep(root):返回以root为根的子树中,从root出发向下延伸的最大路径和(仅能选左子树或右子树中的一条分支,或不选分支) - 递归逻辑
- 终止条件:若root为null,返回 0(空节点不贡献值)
- 递归处理子树:计算左子树和右子树的最大向下路径和left和right
- 更新全局最大值:经过root的路径和可能为left + right + root.val(左右子树分叉路径),与当前全局最大值比较并更新
- 返回值:root能向上传递的最大路径和为root.val + max(left, right, 0)(若子树贡献为负,则不选该子树,取 0)
三、关键细节与边界情况
- 负数处理
若子树的最大贡献为负数,应舍弃该子树(取 0),避免拉低路径和。例如:节点值为 5,左子树贡献 - 3,右子树贡献 - 2,则向上传递的路径和为 5(5 + 0) - 单节点树
当树中只有一个节点时,最大路径和为该节点的值 - 全局变量的作用
全局变量maxSum用于记录所有可能路径中的最大值,避免递归返回值仅能传递单边路径的限制
实现
var maxPathSum = function (root) {let max = -Infinity;const deep = (root) => {if (!root) return 0;const left = Math.max(0, deep(root.left));const right = Math.max(0, deep(root.right));// 中const curVal = root.val + left + right;max = Math.max(max, curVal)return root.val + Math.max(left, right);}deep(root)return max;
};