二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点
root
,返回其 最大路径和 。
解法 递归
思路
要求最大的路径和这个大的问题,我们可以将它拆解成子问题左子树最大的路径和与右子树最大路径和以及当前节点。
那单个节点的最大路径和就是它自己,如果它有左右子树,尝试累加起来即当前通路是否是最大,如果是最大就更新答案,因为可能存在路径节点为负数的情况。
最后返回只能返回一条路径,不能将整个子树的最大和返回。即左右子树与当前节点的最大值。
代码
function maxPathSum(root: TreeNode | null): number {
let result = -Infinity;
const findSum = (node) => {
if (!node) return 0;
const left = Math.max(0, findSum(node.left));
const right = Math.max(0, findSum(node.right));
const currentPath = left + node.val + right;
result = Math.max(result, currentPath);
return node.val + Math.max(left, right);
};
findSum(root);
return result;
};
时空复杂度
时间复杂度:O(n)
空间复杂度:O(h)