給定一棵二叉樹,你需要計算它的直徑長度。一棵二叉樹的直徑長度是任意兩個結點路徑長度中的最大值。這條路徑可能穿過根結點。
示例 :
給定二叉樹
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...