- 三个节点
对于这个二叉树,最大路径和 要比较六个值
根节点-> 2左节点-> -4右节点-> 3根节点 + 左节点-> -2根节点 + 右节点-> 5左节点 + 根节点 + 右节点-> 1
所以和最大路径为根节点 + 右节点
- 在上述二叉树上添加 另外两个节点
3,5,如下图,虚线部分为①中二叉树
这个时候同样需要比较六个值:
根节点右节点左二叉树根节点 + 左节点根节点 + 右节点
根节点 + 右节点根节点 + 左二叉树的较大路径(不包含 左 -> 根 -> 右)左二叉树的较大路径(不包含 左 -> 根 -> 右) + 根节点 + 右节点
从 ① ② 中可以看出,之类有个重复比较过程: 左右子树的最大路径
深度优先遍历,对每个子树取最大值,同时返回根 + 左节点或者根 + 右节点中较大值 为其父节点路径做准备。
function maxPathSum(root: TreeNode | null): number {
let max = Number.MIN_SAFE_INTEGER
function dp(root: TreeNode | null): number {
if (root === null) return 0
const left = root.left && dp(root.left)
const right = root.right && dp(root.right)
const leftValue = left! + root.val
const rightValue = right! + root.val
// 取最大值
max = Math.max(
max,
leftValue,
rightValue,
root.val,
left! + right! + root.val
)
// 为父节点 计算 路径做准备
return Math.max(leftValue, rightValue, root.val)
}
dp(root)
return max
}