路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给定一个二叉树的根节点 root ,返回其 最大路径和,即所有路径上节点值之和的最大值。
如下图红色部分和为最大值,为 20 + 15 + 2 + 7 = 44
思路:
- 最值无非就是
node.val + 左子树和 + 右子树和集合中的最大值 - 某个节点贡献的价值为
node.val + Math.max(左子树和,右子树和) - 需要注意的是某个节点贡献的价值为负数了,则应该设置为0,表示不做贡献,不脱最值后腿
var maxPathSum = function (root) {
let max = -Infinity; // 最大路径和
dfs(root);
return max;
function dfs(node) {
if (node == null) {
return 0;
}
var left = dfs(node.left);
var right = dfs(node.right);
max = Math.max(max, left + node.val + right);
var res = node.val + Math.max(left, right);
return res < 0 ? 0 : res;
}
};
调试代码
var obj = {
val: -10,
left: {
val: 9,
left: null,
right: null,
},
right: {
val: 20,
left: {
val: 15,
left: {
val: 1,
left: null,
right: null,
},
right: {
val: 2,
left: null,
right: null,
},
},
right: {
val: 7,
left: null,
right: null,
},
},
};
console.log(maxPathSum(obj));