leetcode 543 二叉樹的直徑

2021-10-08 04:56:51 字數 1459 閱讀 8124

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

示例 :

給定二叉樹

1/ \

2   3

/ \     

4   5    

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

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

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

maxlength = 0

def diameterofbinarytree(self, root):

""":type root: treenode

:rtype: int

"""if not root:

return 0

leftdepth = self.getmaxlength(root.left)

rightdepth = self.getmaxlength(root.right)

self.maxlength = max(self.maxlength, leftdepth + rightdepth + 1)

return self.maxlength - 1 if self.maxlength != 0 else 0

def getmaxlength(self, root):

if not root:

return 0

leftdepth = self.getmaxlength(root.left)

rightdepth = self.getmaxlength(root.right)

self.maxlength = max(self.maxlength, leftdepth + rightdepth + 1)

return max(leftdepth + 1, rightdepth + 1)

我們可以利用遞迴的思想思考問題,那麼很容易的我們會轉而去考慮對於乙個節點,它的最長路徑是多少(該路徑必經過節點)。可以很快得出結論,那就是最長路徑 = 左子樹的最大深度 + 右子樹的最大深度 + 1。那麼題目就可以轉化為求一顆樹每個節點的最長路徑,以及這顆樹的最長路徑是多少。我們可以讓遞迴方程返回乙個節點的最大深度,那麼父節點在呼叫方程時就可以很快獲得它的左右孩子的深度,從而計算出最長路徑。 然後我們只要保留乙個成員變數maxlength表示該樹的最大路徑,在每個節點進行計算的時候對該值進行更新,就能得到最後的答案。

LeetCode 543 二叉樹的直徑

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

leetcode 543 二叉樹的直徑

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

Leetcode 543 二叉樹的直徑

題目描述 給定一棵二叉樹,你需要計算它的直徑長度。一棵二叉樹的直徑長度是任意兩個結點路徑長度中的最大值。這條路徑可能穿過根結點。思路 直徑長度 路徑的節點數 1 以每個節點為 根節點 的最長路徑,找出最大值。最長路徑上的節點數是 1 左子樹深度 右子樹深度 樹深度是1 max 左子樹深度,右子樹深度...