給定一棵二叉樹,你需要計算它的直徑長度。一棵二叉樹的直徑長度是任意兩個結點路徑長度中的最大值。這條路徑可能穿過也可能不穿過根結點。
示例 :
給定二叉樹
返回 3, 它的長度是路徑 [4,2,1,3] 或者 [5,2,1,3]。
概念理解
這條路徑可能穿過也可能不穿過根結點→ 任意一條路徑可由某結點為起點,再向下遍歷其左孩子和右孩子得到。
設某結點的左孩子向下遍歷經過最多的結點數為 l(以左孩子為根),其右兒子向下遍歷經過最多的結點數為 r (以右孩子為根),則以該結點為起點的路徑經過節點數的最大值即為 l + r + 1(再加上根節點) 。
題目所給函式名是直接得到結果,於是在解題時需要定義遞迴函式,記錄某結點 node 為起點的路徑經過節點數的最大值為 self.d,為全域性變數,返回的結果為 self.d - 1。
遞迴函式返回該結點為根的子樹的深度。先遞迴呼叫左孩子和右孩子分別求以它們為根的子樹的深度 l 和 r ,則該結點為根的子樹的深度為max(l,r)+1。
# definition for a binary tree node.
# class treenode:
# def __init__(self, x):
# self.val = x
# self.left = none
# self.right = none
class
solution
:def
diameterofbinarytree
(self, root: treenode)
->
int:
self.d =
1def
depth
(node):if
not node:
return
0 l = depth(node.left)
r = depth(node.right)
self.d =
max(self.d, l+r+1)
return
max(l, r)+1
depth(root)
return self.d -
1
與二叉樹的最大深度題目的遞迴原理相同,向下遍歷每個結點的左右子樹,此題中,路徑長度與路徑所經過的結點數相關,直徑是任意兩結點間的最長的路徑長度。 二叉樹的直徑
題目 給定一棵二叉樹,你需要計算它的直徑長度。一棵二叉樹的直徑長度是任意兩個結點路徑長度中的最大值。這條路徑可能穿過根結點。示例 給定二叉樹 返回 3,它的長度是路徑 4,2,1,3 或者 5,2,1,3 注意 兩結點之間的路徑長度是以它們之間邊的數目表示。思想 我們不難發現這個問題的本質就是求每個...
二叉樹的直徑
題目 給定一棵二叉樹,你需要計算它的直徑長度。一棵二叉樹的直徑長度是任意兩個結點路徑長度中的最大值。這條路徑可能穿過也可能不穿過根結點。definition for a binary tree node.public class treenode class solution diameterofb...
二叉樹直徑問題
二叉樹的直徑 根據題目意思,所謂二叉樹的直徑,就是以某一結點為根,左右子樹深度之和減1。二叉樹的題目,不用多說,肯定是遞迴遍歷框架。後序 void lastorder treenode root 考慮的重點在於,後序中的操作是什麼,左右子樹返回什麼。顯然,對於當前訪問的結點,我們的目標是以它為根的直...