Tên phép duyệt nói vị trí thăm gốc
Duyệt cây là thăm mỗi nút thật đúng một lần. Với cây con bất kì:
|Phép duyệt|Thứ tự|
|---|---|
|Duyệt trước — preorder|Gốc → toàn bộ cây con trái → toàn bộ cây con phải|
|Duyệt giữa — inorder|Toàn bộ cây con trái → gốc → toàn bộ cây con phải|
|Duyệt sau — postorder|Toàn bộ cây con trái → toàn bộ cây con phải → gốc|
“Duyệt cây con trái” nghĩa là áp dụng lại chính quy tắc đang dùng cho cả cây con ấy, không chỉ đọc một nút con rồi chuyển ngang. Gặp chỉ số ngoài mảng hoặc None thì không thăm nút và không đi tiếp nhánh đó.
Thay in trực tiếp bằng thêm vào danh sách kết quả
Các hàm dưới đây nhận out là danh sách kết quả, ban đầu rỗng. Sau khi gọi, in out để xem thứ tự. Phần reverseorder dùng ở bài sắp xếp phía sau.
```python
def preorder(T, k, out):
if 0 <= k < len(T) and T[k] is not None:
out.append(T[k])
preorder(T, left(k), out)
preorder(T, right(k), out)
def inorder(T, k, out):
if 0 <= k < len(T) and T[k] is not None:
inorder(T, left(k), out)
out.append(T[k])
inorder(T, right(k), out)
def postorder(T, k, out):
if 0 <= k < len(T) and T[k] is not None:
postorder(T, left(k), out)
postorder(T, right(k), out)
out.append(T[k])
def reverseorder(T, k, out):
if 0 <= k < len(T) and T[k] is not None:
reverseorder(T, right(k), out)
out.append(T[k])
reverseorder(T, left(k), out)
```
Theo dõi trên cây gốc 8
Với `T=[8,4,12,2,6,10,14]`:
|Phép duyệt|Kết quả|
|---|---|
|Trước|8,4,2,6,12,10,14|
|Giữa|2,4,6,8,10,12,14|
|Sau|2,6,4,10,14,12,8|
Duyệt sau phải hoàn tất cây con trái gốc 4: thăm 2,6 rồi 4; sau đó hoàn tất cây con phải gốc 12: thăm 10,14 rồi 12; cuối cùng mới thăm 8.
```python
T = [8,4,12,2,6,10,14]
out = []
postorder(T, 0, out)
print(out)
```
Mỗi lần muốn lấy một kết quả riêng, tạo out mới hoặc xóa kết quả cũ trước. Nếu dùng lại out mà không xóa, kết quả lần sau sẽ nối vào lần trước.
Bài luyện
Duyệt trước cây mẫu [8,4,12,2,6,10,14] nhận thứ tự nào?
Đây là duyệt giữa cây mẫu.
Đúng. Thăm gốc rồi hoàn tất trái trước khi sang phải.
Đây là duyệt sau.
Đây là thứ tự mảng theo mức, không phải duyệt trước.
Lời giải
Thăm 8 trước. Cây con trái cho 4,2,6; cây con phải cho 12,10,14. Ghép lại thành 8,4,2,6,12,10,14.
Bài luyện
Duyệt sau cây mẫu, nút nào được thăm cuối?
2 là lá được thăm trước trong nhánh trái.
14 được thăm trước gốc cây con phải.
Đúng. Duyệt sau đặt gốc toàn cây cuối cùng.
Sau 12 vẫn phải thăm gốc 8.
Lời giải
Duyệt sau theo trái–phải–gốc. Sau khi hoàn tất cả cây con trái và phải của 8, mới thăm 8; vì vậy gốc là nút cuối.
Bài luyện
Với T=[8,4,12,None,6], duyệt giữa cho kết quả gì?
Đúng. Bỏ qua vị trí trống, thăm trái–gốc–phải.
None không phải nút thật để đưa ra kết quả.
6 là con phải của 4 nên thăm sau 4.
Đây là thứ tự duyệt trước.
Lời giải
Cây con trái gốc 4 không có con trái, có con phải 6, nên cho 4,6. Sau đó thăm gốc 8 và cây con phải 12, được 4,6,8,12.
Đang học