สมมติว่าเรามีต้นไม้ไบนารีที่ค่าของแต่ละโหนดแสดงถึงสีของมัน ต้นไม้มีอย่างน้อย 2 สี เราต้องตรวจสอบว่าสามารถสลับสีของโหนดกี่ครั้งก็ได้ เพื่อไม่ให้มีโหนดที่เชื่อมต่อกันสองโหนดมีสีเดียวกัน
ดังนั้นหากอินพุตเป็นแบบ
แล้วผลลัพธ์จะเป็น True อย่างที่เราหาได้
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- สี :=แผนที่ว่างเปล่า
- prop :=แผนที่ว่างเปล่า
- กำหนดฟังก์ชัน dfs() สิ่งนี้จะใช้โหนดและแฟล็ก
- ถ้าโหนดเป็น null แล้ว
- คืนสินค้า
- สี[ค่าของโหนด] :=สี[ค่าของโหนด] + 1
- prop[flag] :=prop[flag] + 1
- dfs(ด้านซ้ายของโหนด ผกผันของแฟล็ก)
- dfs(ด้านขวาของโหนด ผกผันของแฟล็ก)
- จากวิธีหลัก ให้ทำดังนี้:
- dfs(root, true)
- คืนค่า จริง เมื่อองค์ประกอบทั้งหมดในสีและอุปกรณ์ประกอบฉากเหมือนกัน มิฉะนั้น จะเป็นเท็จ
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
from collections import defaultdict class TreeNode: def __init__(self, data, left = None, right = None): self.val = data self.left = left self.right = right class Solution: def solve(self, root): colors = defaultdict(int) prop = defaultdict(int) def dfs(node, flag=True): if not node: return colors[node.val] += 1 prop[flag] += 1 dfs(node.left, not flag) dfs(node.right, not flag) dfs(root) return set(colors.values()) == set(prop.values()) ob = Solution() root = TreeNode(2) root.left = TreeNode(2) root.right = TreeNode(2) root.right.left = TreeNode(1) root.right.right = TreeNode(1) root.right.left.right = TreeNode(1) print(ob.solve(root))
อินพุต
root = TreeNode(2) root.left = TreeNode(2) root.right = TreeNode(2) root.right.left = TreeNode(1) root.right.right = TreeNode(1) root.right.left.right = TreeNode(1)
ผลลัพธ์
True