剑指 Offer II 051. 节点之和最大的路径

93 阅读1分钟

剑指 Offer II 051. 节点之和最大的路径

路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。

路径和 是路径中各节点值的总和。

给定一个二叉树的根节点 root ,返回其 最大路径和,即所有路径上节点值之和的最大值。

如下图红色部分和为最大值,为 20 + 15 + 2 + 7 = 44

image.png

思路:

  • 最值无非就是 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));