LeetCode解題之Binary Tree Maximum Path Sum
原題
求一棵二叉樹中最大的路徑和。該路徑可以是二叉樹中某一節點到樹中任意一個節點的所經過的路徑,不允許重複經過一個節點,不必經過根節點。
注意點:
- 無
例子:
輸入:
1
/ \
2 3
輸出: 6
解題思路
採用遞歸的方法,我們知道一條路徑必定有一個節點最接近根節點,而該條路徑的和就是這個節點的值加上它左右路徑的和。我們現在要求最大路徑和,那麼就要分別得到左右兩條路徑的最大和。而左路徑的最大和爲左節點的值加上它左右路徑中較大的路徑和,右路徑最大和爲右節點的值加上它左右路徑中較大的路徑和。注意如果某條子路徑的和爲負,應該將該條子路徑直接砍掉。
AC源碼
# Definition for a binary tree node.
class TreeNode(object):
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution(object):
def maxPathSum(self, root):
"""
:type root: TreeNode
:rtype: int
"""
self.maxSum = float('-inf')
self._maxPathSum(root)
return self.maxSum
def _maxPathSum(self, root):
if root is None:
return 0
left = self._maxPathSum(root.left)
right = self._maxPathSum(root.right)
left = left if left > 0 else 0
right = right if right > 0 else 0
self.maxSum = max(self.maxSum, root.val + left + right)
return max(left, right) + root.val
歡迎查看我的Github (https://github.com/gavinfish/LeetCode-Python) 來獲得相關源碼。