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ư
thì đầu ra sẽ là True như chúng ta có thể nhận được
Để 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