543 二叉樹的直徑

2021-10-03 17:36:28 字數 1399 閱讀 2616

給定一棵二叉樹,你需要計算它的直徑長度。一棵二叉樹的直徑長度是任意兩個結點路徑長度中的最大值。這條路徑可能穿過根結點。

示例 :

給定二叉樹

1/ \

2 3

/ \

4 5

返回 3, 它的長度是路徑 [4,2,1,3] 或者 [5,2,1,3]。

注意:兩結點之間的路徑長度是以它們之間邊的數目表示。

假設最長路徑經過節點n,那麼最長路徑的節點數就是節點n的左子樹長度l(該節點的左兒子向下遍歷經過最多的節點數 l)和右子樹長度r(右兒子向下遍歷經過最多的節點數 r )的和加當前節點,即(l+r+1),路徑長度即為(l+r)。

我們定義乙個遞迴函式 dfs計算 ,函式返回該節點為根的子樹的深度。先遞迴呼叫左兒子和右兒子求得它們為根的子樹的深度 l 和 r ,則該節點為根的子樹的深度即為max(l,r)+1

# 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):

defdiameterofbinarytree

(self, root)

:"""

:type root: treenode

:rtype: int

"""# 二叉樹的 每個節點的左右子樹的高度和 的最大值

# 最長直徑不一定經過根節點,這點注意

self.ret_num =

1# 記錄節點最大值

defdfs

(node)

:# 當為空節點時返回0

if node ==

none

:return

0# 左子樹深度

l = dfs(node.left)

# 右子樹深度

r = dfs(node.right)

# 經過當前節點的的二叉樹的直徑為(l + r + 1),與記錄的最大直徑進比較

self.ret_num =

max(self.ret_num, l + r +1)

# 以當前節點為父節點的樹的深度為 max(l, r) + 1,即當前節點的左子樹和右子樹中深度較大的加1就是當前節點的深度

return

max(l, r)+1

dfs(root)

return self.ret_num -

1

543 二叉樹的直徑

一種比較好的思路是。隨便找乙個點 一般取根節點 找到這棵樹中,距離這個點最遠的點,再從找到的這個點開始,找到距離它最遠的點。這種思路是帶有很強烈的數學成分。證明可自行解決。b站大佬是用動歸來做的,我不是很好理解。這裡給出一種基礎做法,即借助求二叉樹的深度的方式。對於每乙個節點,求其左右子樹的最大深度...

543 二叉樹的直徑

給定一棵二叉樹,你需要計算它的直徑長度。一棵二叉樹的直徑長度是任意兩個結點路徑長度中的最大值。這條路徑可能穿過根結點。示例 給定二叉樹 1 2 3 4 5返回3,它的長度是路徑 4,2,1,3 或者 5,2,1,3 注意 兩結點之間的路徑長度是以它們之間邊的數目表示。分析 考慮分治法。先求某節點到其...

543 二叉樹的直徑

給定一棵二叉樹,你需要計算它的直徑長度。一棵二叉樹的直徑長度是任意兩個結點路徑長度中的最大值。這條路徑可能穿過根結點。示例 給定二叉樹 1 2 3 4 5返回3,它的長度是路徑 4,2,1,3 或者 5,2,1,3 注意 兩結點之間的路徑長度是以它們之間邊的數目表示。class solution o...