給定一個非空二叉樹,返回其最大路徑和。
本題中,路徑被定義爲一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含一個節點,且不一定經過根節點。
示例 1:
輸入: [1,2,3]
1
/ \
2 3
輸出: 6
示例 2:
輸入: [-10,9,20,null,null,15,7]
-10
/ \
9 20
/ \
15 7
輸出: 42
解題思路:
遞歸,涉及到樹的題目一般採用遞歸的方式。
- 首先判斷左子樹的和,如果是負數就返回0
- 然後判斷右子樹的和,如果是負數就返回0
- 左右子樹與根節點的值求和作爲局部最大值
- 與歷史局部最大值比較得到所有種的最大值
- 返回給上一層時只能選擇一個子樹,返回根節點值加左右子樹的最大值
提交代碼:(遞歸,Runtime: 92 ms, faster than 76.35 % )
class Solution:
def __init__(self):
self.maxSum = float("-inf")
def maxPathSum(self, root: TreeNode) -> int:
def maxdepth(root):
if not root:
return 0
leftsum = max(maxdepth(root.left), 0)
rightsum = max(maxdepth(root.right), 0)
sum = leftsum + rightsum + root.val
self.maxSum = max(sum, self.maxSum)
return max(leftsum, rightsum) + root.val
maxdepth(root)
return self.maxSum