給定乙個二叉樹,找到最長的路徑,這個路徑中的每個節點具有相同值。 這條路徑可以經過也可以不經過根節點。
注意:兩個節點之間的路徑長度由它們之間的邊數表示。
示例 1:
輸入:
輸出:5
/ \4 5
/ \ \
1 1 5
示例 2:2
輸入:
輸出:1
/ \4 5
/ \ \
4 4 5
注意:給定的二叉樹不超過10000個結點。 樹的高度不超過1000。2
對於每個節點,我們想知道向左延伸的最長箭頭和向右延伸的最長箭頭是多少?我們可以用遞迴來解決這個問題。
定義函式 arrow_length(node) 為從節點 node 延伸出的最長箭頭的長度。
//
# definition for a binary tree node.
# class
treenode
:# def __init__
(self, x)
:# self.val = x
# self.left = none
# self.right = none
class
solution
: def longestunivaluepath
(self, root: treenode)
-> int:
self.res =
0 #定義乙個函式,返回該節點延伸出的最長箭頭長度
def arrow_length
(node)
: #如果該節點不是node,直接return
0if not node:
return
0 #如果我們想要知道該節點延伸出去的最長箭頭長度,
#就必須知道該節點的左節點和右節點延伸出去的最長箭頭長度
#這裡可以用到遞迴
left_length =
arrow_length
(node.left) #記錄左節點的最長長度
right_length =
arrow_length
(node.right) #記錄右節點的最長長度
#現在,再定義兩個變數,記錄該節點左右箭頭長度,初始值為0
#那麼,如果左(右)與自己的val不一致,左(右)箭頭長度只剩0
#如果val等於左(右)val,把left_length(right_length)加1
temp_left = temp_right =
0if node.left and node.val == node.left.val:
temp_left = left_length +
1if node.right and node.val == node.right.val:
temp_right = right_length +
1 #現在需要更新目前為止的最長箭頭長度ans
self.res =
max(self.ans, temp_left+temp_right)
#然後返回該節點延伸出的最長箭頭長度(注意不是ans)
return
max(temp_left,temp_right)
arrow_length
(root)
return self.res
時間複雜度:o(n),其中 n 是樹中節點數。我們處理每個節點一次。
空間複雜度:o(h),其中 h 是樹的高度。我們的遞迴呼叫棧可以達到 h 層的深度。
leetcode 遞迴 687 最長同值路徑
給定乙個二叉樹,找到最長的路徑,這個路徑中的每個節點具有相同值。這條路徑可以經過也可以不經過根節點。注意 兩個節點之間的路徑長度由它們之間的邊數表示。示例 1 輸入 5 4 5 1 1 5輸出 2示例 2 輸入 1 4 5 4 4 5輸出 2注意 給定的二叉樹不超過10000個結點。樹的高度不超過1...
LeetCode 687 最長同值路徑
題目描述 給定乙個二叉樹,找到最長的路徑,這個路徑中的每個節點具有相同值。這條路徑可以經過也可以不經過根節點。注意 兩個節點之間的路徑長度由它們之間的邊數表示。示例 1 輸入 5 4 5 1 1 5 輸出 2 示例 2 輸入 1 4 5 4 4 5 輸出 2 注意 給定的二叉樹不超過10000個結點...
leetcode 687 最長同值路徑
給定乙個二叉樹,找到最長的路徑,這個路徑中的每個節點具有相同值。這條路徑可以經過也可以不經過根節點。注意 兩個節點之間的路徑長度由它們之間的邊數表示。此題和leetcode124思路完全相同 題解連線這個題也是這條路徑不能有迴路,也就是這條路徑最多只有乙個節點的兩個子樹都被包括在內,這句話直接理解比...