Cây cân bằng & AVL (giới thiệu)
Bài BST cho thấy cây có thể lệch thành O(n). Cây AVL sửa điều đó: nó tự cân bằng sau mỗi lần chèn/xóa bằng phép xoay, giữ chiều cao luôn ~log n. (Bài giới thiệu — nắm ý tưởng, chưa cần thuộc cài đặt.)
1. Ý tưởng: giữ cây không lệch
Cây AVL là một BST có thêm luật: tại mọi nút, chiều cao hai cây con không lệch nhau quá 1. Nếu một thao tác làm lệch quá → cây tự xoay lại cho cân.
Hệ số cân bằng của một nút = (chiều cao cây con trái) − (chiều cao cây con phải). AVL giữ hệ số này luôn ở −1, 0, hoặc +1.
Cân bằng (OK): Lệch (vi phạm AVL):
3 1
/ \ \
1 5 2 ← hệ số = -2, phải xoay!
\
3
2. Phép xoay: cách cây tự sửa
Khi một nút lệch quá, AVL thực hiện phép xoay (rotation) — sắp xếp lại vài con trỏ để hạ chiều cao mà vẫn giữ tính chất BST. Ví dụ "xoay trái" khi cây nghiêng phải:
xoay trái quanh A:
A B
\ / \
B ──▶ A C
\
C
(cao 3, lệch) (cao 2, cân)
Có 4 loại xoay: trái, phải, trái-phải, phải-trái — tùy hướng lệch. Điểm cốt lõi cần nhớ: xoay là O(1) (chỉ đổi vài con trỏ), và sau xoay cây lại cân.
3. Vì sao quan trọng: O(log n) ĐẢM BẢO
Vì luôn cân, AVL đảm bảo chiều cao ~log n → tìm/chèn/xóa luôn O(log n), kể cả khi chèn dữ liệu đã sắp xếp (thứ làm BST thường suy biến). Chèn/xóa tốn thêm chi phí xoay nhưng vẫn O(log n).
Với 1 triệu phần tử: BST lệch cao 1.000.000 (tìm kiếm thảm họa), AVL chỉ cao ~29 → tìm kiếm tức thì.
4. AVL vs BST thường
| BST thường | AVL | |
|---|---|---|
| Tìm/chèn/xóa | O(log n) nếu may, O(n) nếu lệch | O(log n) đảm bảo |
| Tự cân bằng | không | có (bằng xoay) |
| Chi phí chèn/xóa | thấp | cao hơn chút (kiểm tra + xoay) |
| Dùng khi | dữ liệu ngẫu nhiên, đơn giản | cần đảm bảo hiệu năng |
5. Mẫu nhận diện
- Cần BST nhưng đảm bảo O(log n) trong mọi tình huống → cây tự cân bằng (AVL).
- Dữ liệu vào có thể đã sắp xếp / theo thứ tự → BST thường nguy hiểm, dùng AVL.
- Trong thực tế ít khi tự cài AVL — dùng cấu trúc cân bằng có sẵn của ngôn ngữ (xem bài red-black).
6. 🎮 Trò chơi: Hiểu AVL
7. Quiz kiểm tra nhanh
📚 Đọc thêm & Luyện tập
- William Fiset — AVL Tree Insertions & Rotations — Giải thích 4 loại xoay (LL/RR/LR/RL) với minh họa từng bước
- NeetCode — Trees playlist (BST, Balanced Trees) — Cách tiếp cận thực chiến cho interview, bao gồm cả balanced BST
- LeetCode — tag: Binary Search Tree — Insert, Delete, Validate, Kth Smallest — luyện hiểu BST trước khi nắm AVL
8. Hoàn thành
…☑️ Tiếp theo: 2.5.4 — Cây đỏ-đen (red-black tree).