总体思路:对于从任意节点开始的路径,在遍历的路上遇到某节点 node 时,我们有两个选择:第一,不选 node 节点,直接终止这条路的遍历。第二,选择 node 节点,这意味着结果等于 node 节点的值 加上 分别从 node 左、右子节点开始到某叶子节点为止的路径和的最大值。
dfs 函数返回的是:从 root(输入的形参)节点开始往下遍历到某叶子节点为止,其左、右子树路径中节点值的和较大的那个与 0 相比的较大者。
function maxPathSum(root) { let res = -Number.MAX_VALUE; function dfs(root) { if (!root) return 0; let left = dfs(root.left), right = dfs(root.right); // 更新 res,当 res = res,即意味着不选当前节点; res = left + right + root.val 意味着选择当前节点 res = Math.max(res, left + right + root.val); // 返回 0 意味着不选 root 节点,否则选择 root 节点,并返回 Math.max(left, right) + root.val。 return Math.max(0, Math.max(left, right) + root.val); } dfs(root); return res; }