开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情
路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 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;
};