Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมหาความกว้างสูงสุดของไบนารีทรีใน Python


สมมติว่าเรามีไบนารีทรี เราต้องหาความกว้างสูงสุดของระดับใดๆ ในทรี ความกว้างของระดับคือจำนวนโหนดที่สามารถเก็บระหว่างโหนดซ้ายสุดและโหนดขวาสุดได้

ดังนั้นหากอินพุตเป็นแบบ

โปรแกรมหาความกว้างสูงสุดของไบนารีทรีใน Python

แล้วผลลัพธ์จะเป็น 2

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้-

  • สร้างแผนที่ d เพื่อเก็บค่าต่ำสุดและสูงสุด ค่าต่ำสุดเริ่มต้นคืออนันต์และสูงสุดคือ 0

  • กำหนดฟังก์ชัน dfs() สิ่งนี้จะหยั่งราก pos :=0, ความลึก :=0

  • ถ้ารูทเป็นโมฆะ จะไม่มีการส่งคืน

  • d[ความลึก, 0] =ค่าต่ำสุดของ d[ความลึก,0] และตำแหน่ง

  • d[ความลึก, 1] =สูงสุดของ d[ความลึก,1] และตำแหน่ง

  • dfs (ด้านซ้ายของโหนด, 2*pos, ความลึก+1)

  • dfs(ทางขวาของโหนด, 2*pos+1, ความลึก+1)

  • จากวิธีหลัก ให้ทำดังนี้−

  • dfs(root)

  • mx:=0

  • สำหรับแต่ละคู่ min-max ในรายการค่าทั้งหมดของ d ทำ

    • ซ้าย :=นาที ขวา :=สูงสุด

    • mx:=สูงสุดของ mx, right-lef+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