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

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

ความกว้างของระดับ: จำนวนตำแหน่งที่สามารถมีโหนดได้ระหว่างโหนดซ้ายสุดและขวาสุด (รวมช่องว่าง)

ใช้การจัดตำแหน่งแบบ heap: ราก=0, ลูกซ้าย=2*pos, ลูกขวา=2*pos+1 หาความกว้าง = max_pos - min_pos + 1 ทุกระดับ

อัลกอริธึม DFS

  • DFS บันทึก min/max position ของแต่ละ depth
  • คำนวณความกว้างแต่ละระดับ หาค่าสูงสุด

การนำไปใช้

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 l, r in d.values():
            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))  # 2