Cho một cây nhị phân. Tìm cây con là Binary Search Tree (BST) lớn nhất (theo số nút). Trả về nút gốc của BST đó.
Ví dụ
Cây đầu vào: [1, 4, 6, 3, 5] (level-order)
1
/ \
4 6
/ \
3 5
BST lớn nhất: cây con gốc 4 (3, 4, 5). In-order traversal: 3, 4, 5.
Thuật toán
Giống bài trước nhưng chỉ trả về gốc BST thay vì tính tổng.
- Biến
c(kích thước max),m(gốc BST max) - Hàm
recurse(node)post-order:- Đệ quy con trái, phải
- Kiểm tra: left.val ≤ node.val ≤ right.val
- Nếu BST: count = left_count + right_count + 1
- Cập nhật max
- Gọi recurse(root), trả về m
Mã nguồn
class TreeNode:
def __init__(self, val, left=None, right=None):
self.val = val
self.left = left
self.right = right
def insert(temp, data):
que = [temp]
while que:
temp = que.pop(0)
if not temp.left:
temp.left = TreeNode(data) if data is not None else TreeNode(0)
break
else:
que.append(temp.left)
if not temp.right:
temp.right = TreeNode(data) if data is not None else 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 print_tree(root):
if root is not None:
print_tree(root.left)
print(root.val, end=', ')
print_tree(root.right)
def solve(root):
c, m = 0, None
def recurse(node):
nonlocal c, m
if node:
left_val = recurse(node.left)
right_val = recurse(node.right)
count = -float("inf")
if (node.left is None or node.left.val <= node.val) and \
(node.right is None or node.val <= node.right.val):
count = left_val + right_val + 1
if count > c:
c = count
m = node
return count
return 0
recurse(root)
return m
tree = make_tree([1, 4, 6, 3, 5])
print_tree(solve(tree)) # Output: 3, 4, 5,
Lưu ý
Code kiểm tra BST đơn giản: chỉ so sánh với con trực tiếp. Đúng khi duyệt post-order vì cây con đã được kiểm tra. Tuy nhiên, BST chuẩn yêu cầu: tất cả nút trong cây con trái < nút gốc < tất cả nút trong cây con phải. Code này chấp nhận cây con trái có nút lớn hơn gốc nếu nút đó không phải con trực tiếp (logic hơi lỏng). Để chặt chẽ hơn, cần trả về (min, max, is_bst, size) từ đệ quy.