二叉樹的直徑

2021-10-11 12:51:35 字數 1312 閱讀 7559

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

示例 :

給定二叉樹

返回 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 考慮的重點在於,後序中的操作是什麼,左右子樹返回什麼。顯然,對於當前訪問的結點,我們的目標是以它為根的直...