สมมติว่าเรามีไบนารีทรี เราต้องหาความกว้างสูงสุดของระดับใดๆ ในทรี ความกว้างของระดับคือจำนวนโหนดที่สามารถเก็บระหว่างโหนดซ้ายสุดและโหนดขวาสุดได้
ดังนั้นหากอินพุตเป็นแบบ
แล้วผลลัพธ์จะเป็น 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