Nhỏ hơn sang trái, lớn hơn sang phải
Chèn một khóa bắt đầu từ gốc. Nếu nhỏ hơn khóa hiện tại thì sang trái, lớn hơn thì sang phải. Gặp khóa bằng nhau thì dừng vì mô hình cơ bản không nhận khóa trùng. Gặp ô trống hoặc chỉ số ngoài mảng thì đặt khóa mới tại vị trí đó, bổ sung None nếu cần.
Hàm trả True nếu thêm mới, False nếu khóa đã có. Chỉ dùng các khóa so sánh được với nhau; None dành cho ô trống.
```python
def insert(T, v):
k = 0
while k < len(T) and T[k] is not None:
if v < T[k]:
k = left(k)
elif v > T[k]:
k = right(k)
else:
return False
if k >= len(T):
T.extend([None] * (k-len(T)+1))
T[k] = v
return True
```
Tìm kiếm bằng vòng lặp hoặc đệ quy
Tìm khóa v cũng đi từ gốc theo so sánh. Nếu bằng thì trả **chỉ số**, không phải chính khóa; gặp vị trí không có nút thì trả −1. Lệnh tìm toàn cây là `search(T,0,v)`.
```python
def search(T, k, v):
while 0 <= k < len(T) and T[k] is not None:
if v == T[k]:
return k
k = left(k) if v < T[k] else right(k)
return -1
def search_recursive(T, k, v):
if not 0 <= k < len(T) or T[k] is None:
return -1
if v == T[k]:
return k
if v < T[k]:
return search_recursive(T, left(k), v)
return search_recursive(T, right(k), v)
```
Chèn 5 và tìm 11 trên cây mẫu
Chèn lần lượt 8,4,12,2,6,10,14 rồi chèn 5:
|Khóa đang xét|So sánh với 5|Đi tiếp|
|---|---|---|
|8|5<8|Trái, chỉ số 1|
|4|5>4|Phải, chỉ số 4|
|6|5<6|Trái, chỉ số 9|
Vị trí 9 chưa có trong mảng dài 7, nên thêm 3 ô để có các chỉ số 7,8,9 rồi đặt 5 tại 9. Mảng thành `[8,4,12,2,6,10,14,None,None,5]`.
Tìm 5 trả 9. Tìm 11 đi qua 8→12→10 rồi sang con phải của 10 đang trống, trả −1. Khi dùng kết quả tìm, phải kiểm k>=0 trước khi đọc T[k]; trong Python T[−1] lại là phần tử cuối, không phải thông báo “không tìm thấy”.
Bài luyện
Chèn 5 vào cây mẫu bảy nút thì 5 nằm ở vị trí nào?
Đúng. Đi trái từ 8, phải từ 4, trái từ 6.
5 lớn hơn 4 nên không vào nhánh của 2.
Khóa 6 không bị thay thế.
Khóa mới không ghi đè 4.
Lời giải
Từ chỉ số 0 đi left(0)=1 vì 5<8; rồi right(1)=4 vì 5>4; rồi left(4)=9 vì 5<6. Vị trí 9 trống là chỗ chèn.
Bài luyện
search(T,0,11) trả −1. Cách xử lí nào đúng?
Trong Python −1 đọc phần tử cuối, sẽ sai ý nghĩa kết quả.
Không tìm thấy không đồng nghĩa tìm thấy ở gốc.
Đúng. −1 là dấu hiệu thất bại của hàm tìm.
Tìm kiếm không tự chèn khóa.
Lời giải
Hàm quy định −1 là không tìm thấy. Cần kiểm k>=0 trước khi truy cập T[k]; nếu không thì thông báo không tìm thấy. Dùng T[−1] sẽ đọc phần tử cuối ngoài ý muốn.
Bài luyện
Trong mô hình khóa khác nhau, insert(T,8) khi 8 đã có sẽ làm gì?
Đây là quy tắc của biến thể cho phép trùng, chưa áp dụng ở đây.
Không có bước xóa.
Mã không đảo mảng.
Đúng. Nhánh bằng nhau dừng ngay.
Lời giải
Khi v bằng khóa nút hiện tại, hàm insert thực hiện return False. Không mở rộng mảng hoặc thêm nút, vì BST cơ bản yêu cầu khóa khác nhau.
Đang học