Giả sử, chúng ta được cung cấp một cây nhị phân và được yêu cầu tìm ra tổ tiên chung thấp nhất của tất cả các nút trong cây. Tổ tiên chung thấp nhất trong cây nhị phân là nút thấp nhất trong đó các nút x1, x2, x3, ...., xn là con cháu. Một nút cụ thể cũng có thể là con của chính nó. Chúng ta phải tìm nút và trả về nó như một đầu ra. Các đầu vào là nút gốc của cây và danh sách các nút mà chúng ta phải tìm ra tổ tiên của nó.
Vì vậy, nếu đầu vào giống như
và danh sách các nút mà chúng ta phải tìm tổ tiên là [6, 8]; thì đầu ra sẽ là 7.
Đầu ra là 7, vì nút thấp nhất trong đó các nút 6 và 8 là con cháu là 7.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
Định nghĩa một hàm fn (). Điều này sẽ lấy nút
-
nếu nút tương tự như null, thì
-
nút trả lại
-
-
ngược lại khi nút được đặt trước trong các nút thì
-
nút trả lại
-
-
left:=fn (left of node),
-
right:=fn (bên phải của nút)
-
nếu trái và phải không rỗng thì
-
nút trả lại
-
-
nếu không,
-
nếu trái hoặc phải không rỗng thì
-
nút trả lại
-
-
-
-
node:=a new list
-
đối với mỗi lớp trong node_list, hãy thực hiện
-
chèn search_node (root, elem) vào cuối các nút
-
-
các nút:=một tập hợp mới từ các nút
-
trả về fn (gốc)
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
import collections class TreeNode: def __init__(self, data, left = None, right = None): self.data = data self.left = left self.right = right def insert(temp,data): que = [] que.append(temp) while (len(que)): temp = que[0] que.pop(0) if (not temp.left): if data is not None: temp.left = TreeNode(data) else: temp.left = TreeNode(0) break else: que.append(temp.left) if (not temp.right): if data is not None: temp.right = TreeNode(data) else: temp.right = TreeNode(0) break else: que.append(temp.right) def make_tree(elements): Tree = TreeNode(elements[0]) for element in elements[1:]: insert(Tree, element) return Tree def search_node(root, element): if (root == None): return None if (root.data == element): return root res1 = search_node(root.left, element) if res1: return res1 res2 = search_node(root.right, element) return res2 def print_tree(root): if root is not None: print_tree(root.left) print(root.data, end = ', ') print_tree(root.right) def solve(root, node_list): nodes = [] for elem in node_list: nodes.append(search_node(root, elem)) nodes = set(nodes) def fn(node): if not node: return node elif node in nodes: return node left, right = fn(node.left), fn(node.right) return node if left and right else left or right return fn(root) root = make_tree([5, 3, 7, 2, 4, 6, 8]) print(solve(root, [6,8]).data)
Đầu vào
make_tree([5, 3, 7, 2, 4, 6, 8]), [6, 8]
Đầu ra
7