Cây đỏ-đen (red-black tree)
Cây đỏ-đen (red-black tree) là một BST tự cân bằng khác, dùng cách tô màu nút thay vì đo chiều cao. Nó cân bằng "đủ tốt" với ít xoay hơn AVL khi cập nhật — nên là cây được dùng nhiều nhất trong thực tế. (Bài giới thiệu — hiểu ý tưởng và khi nào dùng.)
1. Ý tưởng: cân bằng bằng màu, không bằng chiều cao
Thay vì đo chiều cao như AVL, cây đỏ-đen gắn mỗi nút một màu đỏ hoặc đen và tuân theo vài quy tắc màu. Các quy tắc này gián tiếp đảm bảo cây không lệch quá → chiều cao vẫn ~log n.
┌────┐
│ 8 │ (đen)
└─┬──┘
┌───┴────┐
┌─┴─┐ ┌─┴──┐
│ 3 │ │ 10 │ (đỏ)
└───┘ └────┘
2. Năm quy tắc (đọc hiểu, không cần thuộc)
- Mỗi nút đỏ hoặc đen.
- Gốc luôn đen.
- Nút đỏ không có con đỏ (không hai đỏ liền nhau).
- Mọi đường từ một nút xuống các lá có cùng số nút đen.
- Lá (None) coi là đen.
Hệ quả của các quy tắc: đường dài nhất từ gốc xuống lá không quá gấp đôi đường ngắn nhất → cây "đủ cân bằng" → các thao tác vẫn O(log n).
3. Red-black vs AVL: chọn cái nào?
| AVL | Red-black | |
|---|---|---|
| Mức cân bằng | rất chặt | lỏng hơn (đủ tốt) |
| Tìm kiếm | nhanh hơn chút (cây thấp hơn) | hơi chậm hơn chút |
| Chèn/xóa | nhiều xoay hơn | ít xoay hơn → cập nhật nhanh |
| Dùng khi | tra c ứu nhiều, ít cập nhật | cập nhật nhiều (thực tế phổ biến) |
Cả hai đều O(log n). Red-black thắng khi cập nhật thường xuyên; AVL thắng khi tra cứu là chủ yếu. Vì đa số hệ thống cập nhật nhiều, red-black được dùng rộng hơn.
4. Bạn đã dùng red-black mà không biết
Rất nhiều thư viện chuẩn cài map/set có thứ tự bằng cây đỏ-đen:
- Java:
TreeMap,TreeSet. - C++:
std::map,std::set. - Linux kernel: lập lịch tiến trình, quản lý vùng nhớ.
Khi cần map/set giữ thứ tự với hiệu năng O(log n) đảm bảo, bên dưới thường là red-black.
5. Cây cân bằng vs bảng băm — tổng kết
| Bảng băm (dict/set) | Cây cân bằng (red-black) | |
|---|---|---|
| Tra cứu | O(1) trung bình | O(log n) đảm bảo |
| Giữ thứ tự | ❌ không | ✅ có (duyệt ra dãy sắp xếp) |
| Tìm khoảng / min / max / kế cận | kém | ✅ tốt |
| Dùng khi | tra cứu thuần, không cần thứ tự | cần thứ tự, truy vấn khoảng |
6. Mẫu nhận diện
- Cần map/set giữ thứ tự hoặc truy vấn khoảng (min/max, các phần tử trong [a,b]) → cây cân bằng.
- Chỉ c ần tra cứu nhanh, không cần thứ tự → bảng băm.
- Trong thực tế: ít khi tự cài, dùng
TreeMap/std::map/SortedDict... (bên dưới là red-black).
7. 🎮 Trò chơi: Hiểu red-black
8. Quiz kiểm tra nhanh
📚 Đọc thêm & Luyện tập
- William Fiset — Red Black Tree Insertions — Giải thích quy tắc màu và các ca xoay/tô lại sau khi chèn
- Striver — Trees Series (take U forward) — BST và cây cân bằng từ cơ bản đến nâng cao với code Java/C++
- LeetCode — tag: Binary Search Tree — Bài BST cũng luyện tư duy cho các thao tác cây cân bằng
9. Hoàn thành
…☑️ Tiếp theo: 2.5.5 — Heap & hàng đợi ưu tiên.