Computer >> Máy Tính >  >> Lập trình >> Python

Chương trình để kiểm tra xem chúng ta có thể tô màu một cây mà không có nút nào liền kề có cùng màu hay không trong python

Giả sử chúng ta có một cây nhị phân trong đó giá trị của mỗi nút đại diện cho màu của nó. Có nhiều nhất 2 màu trong một cây. Chúng ta phải kiểm tra xem có thể hoán đổi màu của các nút nhiều lần để không có hai nút được kết nối nào có cùng màu hay không.

Vì vậy, nếu đầu vào giống như

Chương trình để kiểm tra xem chúng ta có thể tô màu một cây mà không có nút nào liền kề có cùng màu hay không trong python

thì đầu ra sẽ là True như chúng ta có thể nhận được

Chương trình để kiểm tra xem chúng ta có thể tô màu một cây mà không có nút nào liền kề có cùng màu hay không trong python

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • màu sắc:=một bản đồ trống
  • prop:=một bản đồ trống
  • Định nghĩa một hàm dfs (). Thao tác này sẽ lấy nút và gắn cờ
  • nếu nút là null, thì
    • trở lại
  • màu sắc [giá trị của nút]:=màu sắc [giá trị của nút] + 1
  • prop [flag]:=prop [flag] + 1
  • dfs (bên trái của nút, nghịch đảo của cờ)
  • dfs (bên phải của nút, nghịch đảo của cờ)
  • Từ phương thức chính, hãy làm như sau:
  • dfs (root, true)
  • trả về true khi tất cả các phần tử có màu sắc và giá trị giống nhau, ngược lại là false

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

Ví dụ

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))

Đầu vào

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)

Đầu ra

True