Python程式:查詢二叉樹的最大寬度


假設我們有一個二叉樹,我們需要找到樹中任何一層的最大寬度。這裡,一層的寬度是指可以在最左節點和最右節點之間容納的節點數量。

因此,如果輸入類似於

則輸出將為 2

為了解決這個問題,我們將遵循以下步驟:

  • 建立一個對映 d,用於儲存最小值和最大值,最小值最初為無窮大,最大值為 0。

  • 定義一個函式 dfs()。它將接收根節點、位置 pos(初始值為 0)和深度 depth(初始值為 0)。

  • 如果根節點為空,則返回。

  • d[深度, 0] 等於 d[深度, 0] 和 pos 的最小值。

  • d[深度, 1] 等於 d[深度, 1] 和 pos 的最大值。

  • dfs(節點的左子節點, 2*pos, 深度+1)

  • dfs(節點的右子節點, 2*pos+1, 深度+1)

  • 在主方法中,執行以下操作:

  • dfs(根節點)

  • mx := 0

  • 對於 d 所有值的列表中的每個最小-最大對,執行以下操作:

    • left := min, right := max

    • mx := mx、right-lelf+1 的最大值

  • 返回 mx

讓我們看看以下實現以更好地理解:

示例

即時演示

from collections import defaultdict
   class TreeNode:
      def __init__(self, data, left = None, right = None):
         self.data = data
         self.left = left
         self.right = right
class Solution:
   def solve(self, root):
   d=defaultdict(lambda: [1e9,0])
   def dfs(node, pos=0, depth=0):
      if not node:
         return
      d[depth][0]=min(d[depth][0],pos)
      d[depth][1]=max(d[depth][1],pos)
      dfs(node.left,2*pos,depth+1)
      dfs(node.right,2*pos+1,depth+1)
   dfs(root)
   mx=0
   for interval in d.values():
      l,r=interval
      mx=max(mx,r-l+1)
   return mx

ob = Solution()
root = TreeNode(5)
root.left = TreeNode(1)
root.right = TreeNode(9)
root.right.left = TreeNode(7)
root.right.right = TreeNode(10)
root.right.left.left = TreeNode(6)
root.right.left.right = TreeNode(8)
print(ob.solve(root))

輸入

root = TreeNode(5)
root.left = TreeNode(1)
root.right = TreeNode(9)
root.right.left = TreeNode(7)
root.right.right = TreeNode(10)
root.right.left.left = TreeNode(6)
root.right.left.right = TreeNode(8)

輸出

2

更新於: 2020年10月5日

162 次瀏覽

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.