路径 被定义为一条从树中任意节点出发,沿父节点 - 子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
dfs
特殊点
- 对于当前节点,我们可以选择走左右两个子节点形成的路径
- 所以最大值是
left + root.val + right
- 所以最大值是
- 但是对于自己之外的节点,要经过自己的话,只能选择一条路 ```javascript const maxPathSum = function maxPathSum(root) { let maxSum = Number.MIN_SAFE_INTEGER; // 最大路径和
const dfs = function dfs(root) { if (root == null) { // 遍历到null节点,收益0 return 0; } const left = dfs(root.left); // 左子树提供的最大路径和 const right = dfs(root.right); // 右子树提供的最大路径和
// 对本身来说,可以走左右两个子节点 const innerMaxSum = left + root.val + right; // 当前子树内部的最大路径和 maxSum = Math.max(maxSum, innerMaxSum); // 挑战最大纪录
// 对外面的节点来说,只能选择一条路 const outputMaxSum = root.val + Math.max(left, right); // 当前子树对外提供的最大和
if (outputMaxSum < 0) { // 对外提供的路径和为负,直接返回0 return 0; } return outputMaxSum; // 非负,则正常返回 };
dfs(root); // 递归的入口 return maxSum; };
- 对于当前节点,我们可以选择走左右两个子节点形成的路径
```
