二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 root ,返回其 最大路径和 。
示例 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
递归遍历二叉树,得到左子树的最大和,和右子树的最大和,如果左子树或右子树结果为负数,舍弃结果取0,和当前节点值进行相加
var maxPathSum = function(root) {
let max = -Infinity;
var dfs = function(root) {
if (!root) return 0;
//如果值小于0,则直接舍去结果 取0,保证最后的结果要大
let leftVal = Math.max(dfs(root.left), 0);
let rightVal = Math.max(dfs(root.right), 0);
let current = root.val + leftVal + rightVal;
max = Math.max(max, current);
//当前节点的最大路径
return Math.max(leftVal, rightVal) + root.val;
}
dfs(root);
return max;
};