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

โปรแกรมตรวจสอบว่าเราสามารถระบายสีต้นไม้ที่ไม่มีโหนดที่อยู่ติดกันมีสีเดียวกันหรือไม่ใน python


สมมติว่าเรามีต้นไม้ไบนารีที่ค่าของแต่ละโหนดแสดงถึงสีของมัน ต้นไม้มีอย่างน้อย 2 สี เราต้องตรวจสอบว่าสามารถสลับสีของโหนดกี่ครั้งก็ได้ เพื่อไม่ให้มีโหนดที่เชื่อมต่อกันสองโหนดมีสีเดียวกัน

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

โปรแกรมตรวจสอบว่าเราสามารถระบายสีต้นไม้ที่ไม่มีโหนดที่อยู่ติดกันมีสีเดียวกันหรือไม่ใน python

แล้วผลลัพธ์จะเป็น True อย่างที่เราหาได้

โปรแกรมตรวจสอบว่าเราสามารถระบายสีต้นไม้ที่ไม่มีโหนดที่อยู่ติดกันมีสีเดียวกันหรือไม่ใน python

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

  • สี :=แผนที่ว่างเปล่า
  • 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