Leetcode筆記 687 最長同值路徑

2021-09-26 06:14:29 字數 2118 閱讀 1295

給定乙個二叉樹,找到最長的路徑,這個路徑中的每個節點具有相同值。 這條路徑可以經過也可以不經過根節點。

注意:兩個節點之間的路徑長度由它們之間的邊數表示。

示例 1:

輸入:

5

/ \4 5

/ \ \

1 1 5

輸出:

2
示例 2:

輸入:

1

/ \4 5

/ \ \

4 4 5

輸出:

2
注意:給定的二叉樹不超過10000個結點。 樹的高度不超過1000。

對於每個節點,我們想知道向左延伸的最長箭頭和向右延伸的最長箭頭是多少?我們可以用遞迴來解決這個問題。

定義函式 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思路完全相同 題解連線這個題也是這條路徑不能有迴路,也就是這條路徑最多只有乙個節點的兩個子樹都被包括在內,這句話直接理解比...