Thuật toán Python

Cây nhị phân tìm kiếm trong Python

Cây nhị phân tìm kiếm giữ các giá trị nhỏ hơn ở cây con bên trái và giá trị lớn hơn ở cây con bên phải, nên mỗi lần so sánh loại bỏ được một nửa phần cây còn lại.

Cây nhị phân tìm kiếm trong Python là gì?

Cây nhị phân tìm kiếm giữ các giá trị nhỏ hơn ở cây con bên trái và giá trị lớn hơn ở cây con bên phải, nên mỗi lần so sánh loại bỏ được một nửa phần cây còn lại.

Xây dựng cây nhị phân tìm kiếm bằng Python: chèn giá trị, tìm kiếm và liệt kê chúng theo thứ tự tăng dần.

Khi nào nên sử dụng?

  • Rèn luyện tư duy giải quyết vấn đề và cấu trúc dữ liệu.
  • Xử lý dữ liệu khi cần kiểm soát rõ từng bước của thuật toán.
  • Chuẩn bị cho bài tập, kỳ thi và phỏng vấn lập trình.

Xem cách hoạt động

Chèn giá trị để xem chúng nằm ở đâu, tìm một giá trị để đi theo đường của nó, và chạy một phép duyệt để xem thứ tự thăm.

Code ví dụ

Chạy code →
main.py
class Node:
    def __init__(self, value):
        self.value = value
        self.left = None   # smaller values go left
        self.right = None  # larger values go right


def insert(node, value):
    if node is None:
        return Node(value)
    if value < node.value:
        node.left = insert(node.left, value)
    elif value > node.value:
        node.right = insert(node.right, value)
    return node


def contains(node, value):
    # Each comparison discards one whole subtree.
    while node is not None:
        if value == node.value:
            return True
        node = node.left if value < node.value else node.right
    return False


def inorder(node):
    # Left subtree, node, right subtree: visits values in sorted order.
    if node is None:
        return []
    return inorder(node.left) + [node.value] + inorder(node.right)


def height(node):
    if node is None:
        return 0
    return 1 + max(height(node.left), height(node.right))


root = None
for value in [50, 30, 70, 20, 40, 60, 80]:
    root = insert(root, value)

print("inorder:", inorder(root))
print("contains 60:", contains(root, 60))
print("contains 65:", contains(root, 65))
print("height:", height(root))

Kết quả dự kiến

inorder: [20, 30, 40, 50, 60, 70, 80]
contains 60: True
contains 65: False
height: 3

Cách hoạt động

insert() đi xuống từ gốc và gắn giá trị vào đúng chỗ của nó. contains() chỉ đi theo một đường, mất O(log n) bước khi cây cân bằng. Duyệt inorder thăm trái, node, phải, nên các giá trị được in ra theo thứ tự đã sắp xếp.

Thay đổi giá trị và chạy chương trình bằng trình chạy Python online của CodeUtility mà không cần cài Python.

Bài tập mở rộng

Hãy sửa code theo các bài tập dưới đây để hiểu rõ cách hoạt động thay vì chỉ sao chép kết quả.

  1. Kiểm tra trường hợp rỗng, một phần tử và giá trị trùng lặp.
  2. In trạng thái sau từng bước để quan sát thuật toán.
  3. Đo thời gian với 100, 1.000 và 10.000 phần tử rồi so sánh cách giải khác.
Chạy trong Python IDE →

Luyện tập với thử thách

Áp dụng kiến thức của bài học này để giải một bài toán thực tế. Mỗi thử thách chạy ngay trên trình duyệt, có kiểm thử tức thì và AI nhận xét.

Tất cả thử thách