題目描述
給定一個非空二叉樹,返回其最大路徑和。
本題中,路徑被定義爲一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含一個節點,且不一定經過根節點。
解題思路
二叉樹中的最大路徑和,可以將這個問題進行最小化,如示例1所示,二叉樹僅包含父節點、左節點和右節點三個節點,最大路徑和問題轉化爲了求root.val, root.val+root.left.val, root.val+root.right.val, root.val+root.left.val+root.right.val
四者最大值的問題;進一步,對於示例2,進行該最小問題的延拓,對於每個非根節點可採用上述思路完成,對於上一層的父節點,則需進行適當的變化,由於題目要求爲最大路徑和,那麼,對於子節點而言,左子節點和右子節點只能有一個納入最後的路徑。
Python代碼
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
max_v = -10e9
def maxPathSum(self, root: TreeNode) -> int:
def getMax(root):
if not root:
return 0
left = getMax(root.left)
right = getMax(root.right)
val1 = root.val
val2 = root.val + left
val3 = root.val + right
val4 = root.val + left + right
# 記錄最大值
self.max_v = max([self.max_v, val1, val2, val3, val4])
# 對於當前節點 路徑可以包括左子節點和右子節點
# 但是對於父節點,只能使用該節點的左節點或右節點
return max([val1, val2, val3])
# call function
getMax(root)
return self.max_v