📜  二叉树中的最大路径和(1)

📅  最后修改于: 2023-12-03 15:06:19.939000             🧑  作者: Mango

二叉树中的最大路径和

二叉树中的最大路径和是指二叉树中任意路径中节点值和的最大值,这个路径可以从任意节点到任意节点,但是不能重复经过同一个节点。

例如,给定如下二叉树:

    1
   / \
  2   3

其中,最大路径和为 6,因为路径 2->1->3 的节点值和为 6。

解题思路

这是一道经典的树形DP题目,我们可以采用递归的方式处理二叉树中的最大路径和。

对于二叉树中的每个节点,我们可以把它的最大路径和分成两个部分:

  1. 包含当前节点的路径,记为 root.val + leftPathSum + rightPathSum,其中 leftPathSum 表示以左子节点为起点的最大路径和,rightPathSum 表示以右子节点为起点的最大路径和;
  2. 不包含当前节点的路径,即当前节点的左子树和右子树中的最大路径和,记为 max(leftMaxPathSum, rightMaxPathSum)

对于每一个节点,我们都求出这两个值,然后取它们的最大值作为当前节点的最大路径和。而递归终止条件是节点为空时返回0。

代码实现

下面是Python的代码实现,其中变量 self.ans 表示当前二叉树的最大路径和。

class Solution:
    def __init__(self):
        self.ans = float('-inf')

    def maxPathSum(self, root: TreeNode) -> int:
        def dfs(node):
            if not node:
                return 0
            left_path_sum = max(0, dfs(node.left))
            right_path_sum = max(0, dfs(node.right))
            self.ans = max(self.ans, node.val + left_path_sum + right_path_sum)
            return node.val + max(left_path_sum, right_path_sum)

        dfs(root)
        return self.ans
时间复杂度

对于每个节点,我们需要计算 leftPathSumrightPathSum,因此时间复杂度为 $O(n)$,其中 $n$ 表示二叉树中节点的个数。

空间复杂度

递归的时候,我们需要同时保存每个节点的 leftMaxPathSumrightMaxPathSum,因此空间复杂度为 $O(n)$。