二叉树中的最大路径和

33 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情

124. 二叉树中的最大路径和 - 力扣(LeetCode)

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

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

给你一个二叉树的根节点 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

提示:

  • 树中节点数目范围是 [1, 3 * 10^4]
  • -1000 <= Node.val <= 1000

思路

一棵树的最大路径和可以通过求下面几个值的最大值求得:

  • 左子树的最大路径和
  • 右子树的最大路径和
  • 左子树路径和 + 当前节点
  • 右子树路径和 + 当前节点
  • 左子树路径和 + 右子树路径和 + 当前节点
  • 当前节点

本题可以用深度优先遍历求解。通过不断递归求解各层子树最后求得整颗数的最大路径和。

解题

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number}
 */
var maxPathSum = function (root) {
  let res = -1000;
  const dfs = (node) => {
    let val = node.val;
    let left = 0;
    let right = 0;
    let n = val;
    if (node.left) {
      left = dfs(node.left);
      n = Math.max(n, val + left);
      res = Math.max(res, left, val + left);
    }
    if (node.right) {
      right = dfs(node.right);
      n = Math.max(n, val + right);
      res = Math.max(res, right, val + right);
    }
    res = Math.max(res, val, val + left + right);
    return n;
  };
  dfs(root);
  return res;
};