バイナリツリーのTencent 38-Maxパスと#leetcode124
空でないバイナリツリーを指定すると、その最大パスの合計を返します。
この問題では、パスは、ツリー内の任意のノードから始まり、任意のノードに到達するシーケンスとして定義されます。パスには少なくとも1つのノードが含まれ、必ずしもルートノードを通過するわけではありません。
例1:
入力:[1,2,3]
1
/ \
2 3
出力:6
例2:
入力:[-10,9,20、null、null、15,7]
-10
/
9~20
/
15 7
出力:42
難しいレベル、理解しにくい、
Huahuaソースのビデオを参照、
コードは間違った
ans更新を書きやすく、左右を考慮し
、ノードの結果、左または右しか選択できない
以下に示すツリーの分析:
a
/ \
b c
/ \ / \
d e f g
最大合計のパスは、基本的に次の状況でのみです。
- ノード自体
- これは、特定のノードbをルートノードとするdbeのような「完全なサブツリー」です(選択したノードは、左と右の両方の子によって結合されるか、どちらにも結合されない必要があります)
- dbacfの形式には、「不完全なサブツリー」が含まれます(bの右の子eは追加されず、cの右の子gは追加されません)。
したがって、再帰的なアイデアを採用し、最初にリーフノードに移動して、現在のブランチレイヤーの最大パス合計をレイヤーごとに返します。
最大パスが1または2の場合、バックトラックする必要はありません。つまり、1と2の場合、ルート+左+右パスと最大パスのみを決定する必要があり、値を上位レイヤーに返す必要はありません。そして、3は現在のルート+左またはルート+右が最終パスの左または右ブランチであるかどうかを判断し続ける必要があります(dbはdbacfの左ブランチです)。したがって、バックトラックする必要がある場合は、ルート+左とルート+右の最大値を返す必要があります。ルートの左と右の子が負の場合、現在のサブパスはルートノード自体、つまりルートに戻ります。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def _maxPathSum(self, root) :
if root is None:return float('-inf')
#经过左节点的路径的最大和
l=max(0,self._maxPathSum(root.left))
#经过右节点的路径的最大和
r=max(0,self._maxPathSum(root.right))
#以当前节点为根节点的路径最大和
self.ans=max(self.ans,root.val+l+r)
#返回 经过当前节点的路径最大和
return max(l,r)+root.val
def maxPathSum(self, root: TreeNode) -> int:
#hard级别
self.ans=float('-inf')
self._maxPathSum(root)
return self.ans