Tìm khóa nhỏ nhất và lớn nhất
Trong BST không rỗng, khóa nhỏ nhất ở nút đi hết nhánh trái từ gốc; khóa lớn nhất ở nút đi hết nhánh phải. Các hàm dưới đây trả **giá trị khóa**, không trả chỉ số.
height đếm cạnh: lá cao 0. Trong đệ quy, quy ước trả −1 cho nhánh rỗng để một nút lá có 1+max(−1,−1)=0. Đây là quy ước tính trong mã; gốc của cây không rỗng vẫn ở mức 0.
```python
def height(T, k=0):
if not 0 <= k < len(T) or T[k] is None:
return -1
return 1 + max(height(T, left(k)), height(T, right(k)))
def minimum(T):
if not T or T[0] is None:
raise ValueError("Cây rỗng")
k = 0
while left(k) < len(T) and T[left(k)] is not None:
k = left(k)
return T[k]
def maximum(T):
if not T or T[0] is None:
raise ValueError("Cây rỗng")
k = 0
while right(k) < len(T) and T[right(k)] is not None:
k = right(k)
return T[k]
```
Số nút không phải chiều cao
Cây mẫu bảy nút có height=2, minimum=2, maximum=14. Sau khi chèn 5 làm con trái của 6, đường 8→4→6→5 có ba cạnh nên height=3.
Tìm 5 xét bốn nút 8,4,6,5. Với cây cao h, một đường tìm xét nhiều nhất h+1 nút thật. Khi phân tích tăng trưởng thường viết O(h+1), hay O(h) với h đủ lớn; cây thấp giúp tìm nhanh hơn, cây suy biến n nút có thể phải xét n nút.
Nếu chiều cao giữ ở mức O(log n), tìm kiếm có chi phí O(log n); không kết luận mọi BST đều như vậy. Với biểu diễn mảng, chèn còn có thể tốn thêm nhiều thao tác tạo None. Vì thế không lấy riêng chi phí đi một đường để khẳng định toàn bộ việc dựng cây hoặc sắp xếp bằng mảng luôn O(n log n). Mô hình nút liên kết tránh các ô trống nhưng không tự giải quyết cây lệch.
Bài luyện
Với quy ước của height trong bài, một cây chỉ có gốc có chiều cao bao nhiêu?
Đúng. Không có cạnh nào từ gốc đến chính nó.
1 đếm số nút hoặc mức, không theo quy ước này.
−1 chỉ là giá trị trả cho nhánh rỗng trong mã.
Một nút không có đường dài hai cạnh.
Lời giải
Gốc đồng thời là lá nên đường dài nhất từ gốc đến lá có 0 cạnh. Mã cũng cho 1+max(−1,−1)=0.
Bài luyện
Sau chèn 5 vào cây mẫu, đường 8→4→6→5 có ba cạnh. height(T) là bao nhiêu?
Đường mới đã dài hơn chiều cao cũ một cạnh.
4 là số nút trên đường, không phải số cạnh.
Đúng. Đây là mức sâu nhất mới.
8 là tổng số nút thật sau chèn.
Lời giải
Các nhánh cũ sâu hai cạnh, còn nhánh mới sâu ba cạnh. Mức lớn nhất là 3, nên chiều cao cây sau chèn là 3.
Bài luyện
Vì sao chèn vào BST biểu diễn mảng có thể tốn hơn việc đi một đường tìm vị trí?
Mảng ghi theo cấu trúc, không sắp lại tăng dần.
Đúng. Mở rộng list có chi phí riêng.
Tìm BST chỉ theo một nhánh mỗi bước.
Ô trống không phải nút thật và không phải mọi cây đều lệch.
Lời giải
Sau khi tìm được chỉ số k ngoài mảng, mã phải thêm k−len(T)+1 ô. Số ô này có thể lớn khi cây lệch; nó là chi phí thêm vào ngoài các bước so sánh trên đường tìm.
Đang học