124. Binary Tree Maximum Path Sum 二叉树中的最大路径和
Title
給定一個非空二叉樹,返回其最大路徑和。
本題中,路徑被定義為一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含一個節點,且不一定經過根節點。
示例 1:
輸入: [1,2,3]
1/ \2 3輸出: 6
示例 2:
輸入: [-10,9,20,null,null,15,7]
-10/ \9 20/ \15 7輸出: 42
Solve
遞歸
首先考慮實現一個簡化的函數,該函數計算二叉樹中的一個節點的最大貢獻值,具體而言,就是在以該節點為根節點的子樹中尋找以該節點為起點的一條路徑,使得該路徑上的節點值之和最大。
具體而言,該函數的計算過程如下:
- 空節點的最大貢獻值等于0
- 非空節點的最大貢獻值等于節點值與其子節點中的最大貢獻值之和
上述計算過程是遞歸的過程,因此,對根節點調用此函數,即可得到每個節點的最大貢獻值。
得到每個節點的最大貢獻值之后,對于二叉樹中的一個節點,該節點的最大路徑和取決于該節點的值與該節點的左右子節點的最大貢獻值,如果子節點的最大貢獻值為正數,則計入該節點的最大路徑和,否則不計入該節點的最大路徑和。
維護一個全局變量maxSum存儲最大路徑和,在遞歸過程中更新maxSum的值,最后得到的maxSum的值即為二叉樹中的最大路徑和。
Code
class TreeNode:def __init__(self, x):self.val = xself.left = Noneself.right = Noneclass Solution:def __init__(self):self.maxSum = float("-inf")def maxPathSum(self, root: TreeNode) -> int:def maxGain(node: TreeNode):if not node:return 0leftGain = max(maxGain(node.left), 0)rightGain = max(maxGain(node.right), 0)priceNewPath = node.val + leftGain + rightGainself.maxSum = max(self.maxSum, priceNewPath)return node.val + max(leftGain, rightGain)maxGain(root)return self.maxSum復雜度分析
-
時間復雜度:O(N),其中 N 是二叉樹中的節點個數。對每個節點訪問不超過 2 次。
-
空間復雜度:O(N),其中 N 是二叉樹中的節點個數??臻g復雜度主要取決于遞歸調用層數,最大層數等于二叉樹的高度,最壞情況下,二叉樹的高度等于二叉樹中的節點個數。
總結
以上是生活随笔為你收集整理的124. Binary Tree Maximum Path Sum 二叉树中的最大路径和的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 125. Valid Palindrom
- 下一篇: 实验1 词法分析程序设计