TÓM TẮT
Mở Đầu
B‑cây (B‑tree) là một trong những cấu trúc dữ liệu quan trọng nhất trong lĩnh vực cơ sở dữ liệu và hệ thống tệp tin. Nhờ khả năng cân bằng tự động và hiệu suất truy xuất cao, b‑cây được sử dụng rộng rãi trong các hệ thống quản lý cơ sở dữ liệu (DBMS), hệ thống tập tin (file system) và cả trong các ứng dụng lưu trữ dữ liệu lớn. Tuy nhiên, để hiểu và áp dụng b‑cây một cách hiệu quả, chúng ta cần nắm vững cách vẽ b‑cây – một kỹ năng không chỉ giúp chúng ta hình dung cấu trúc mà còn hỗ trợ trong việc thiết kế, tối ưu và debug các thuật toán liên quan.
Bài viết dưới đây sẽ cung cấp cho bạn một hướng dẫn chi tiết, từ các khái niệm cơ bản, nguyên tắc vẽ, các bước thực hiện, cho đến những lưu ý quan trọng và một số ví dụ thực tế. Mục tiêu là giúp bạn không chỉ biết cách vẽ b‑cây mà còn hiểu sâu về cách hoạt động bên trong, từ đó áp dụng một cách linh hoạt trong các dự án thực tế.
Lưu ý: Bài viết được viết bằng tiếng Việt, tập trung vào cách vẽ b‑cây cho người mới bắt đầu và cả những người đã có kinh nghiệm. Các phần sẽ được chia thành các mục rõ ràng để bạn có thể dễ dàng tra cứu và áp dụng.
1. Khái Niệm Cơ Bản Về B‑Cây
1.1 Định Nghĩa
B‑cây là một cây cân bằng đa nhánh (multi‑way tree) với các thuộc tính sau:
- Mỗi nút có tối đa
2t – 1khóa (key) và tối thiểut – 1khóa, trong đótlà bậc (order) của b‑cây (cũng được gọi là độ hoặc minimum degree). - Mỗi nút nội bộ (nút không phải lá) có từ
tđến2tcon. - Các khóa trong một nút được sắp xếp tăng dần.
- Các khóa trong các con của một nút tuân thủ quy tắc phân đoạn: Nếu một nút có các khóa
k1, k2, …, km(vớimlà số khóa trong nút), thì: - Con thứ
i(đánh số từ 0) chứa các khóa nhỏ hơnki(đối vớii = 1). - Con thứ
i(đánh số từ 1) chứa các khóa nằm giữakivàk(i+1). - Con cuối cùng chứa các khóa lớn hơn
km.
1.2 Lý Do Sử Dụng B‑Cây

Có thể bạn quan tâm: Cách Vẽ Ayato: Hướng Dẫn Chi Tiết Từ Cơ Bản Đến Nâng Cao
- Hiệu suất truy xuất ổn định: Độ sâu của b‑cây luôn giới hạn bởi
log_t N, trong đóNlà số khóa. Điều này đảm bảo số lần truy cập đĩa (hoặc RAM) luôn ổn định. - Cân bằng tự động: Khi chèn hoặc xóa, b‑cây tự động thực hiện các thao tác chia (split) hoặc hợp nhất (merge) để duy trì cân bằng.
- Tối ưu cho lưu trữ trên đĩa: Mỗi nút thường được thiết kế để vừa với một block (đĩa hoặc bộ nhớ), giảm số lần I/O.
- Hỗ trợ tìm kiếm, chèn, xóa trong thời gian
O(log N).
2. Chuẩn Bị Trước Khi Vẽ B‑Cây
2.1 Xác Định Bậc t
- Bậc nhỏ (t = 2, 3): Thích hợp cho việc học và minh hoạ, vì mỗi nút có ít khóa, dễ vẽ trên giấy.
- Bậc lớn (t >= 4): Thường dùng trong thực tế, phù hợp với kích thước block của hệ thống lưu trữ.
Lưu ý: Khi vẽ bằng tay, bạn nên chọn t = 2 hoặc t = 3 để tránh quá nhiều nhánh gây rối mắt.
2.2 Chuẩn Bị Công Cụ
- Bút chì / bút mực: Để vẽ các nút và các đường nối.
- Thước kẻ: Giúp vẽ các hình chữ nhật (nút) và các đường thẳng chính xác.
- Bảng màu (nếu muốn tô màu): Đánh dấu các loại nút (nút gốc, nút lá, nút nội bộ) hoặc các bước thao tác (chèn, split, merge).
- Giấy kẻ ô (tùy chọn): Giúp cân bằng khoảng cách giữa các nút.
2.3 Quy Tắc Đánh Số và Ghi Nhãn
- Khóa (key): Ghi dưới dạng số nguyên hoặc ký tự, sắp xếp tăng dần từ trái sang phải trong mỗi nút.
- Con (child): Ghi nhãn con dưới dạng
C0, C1, …, Cmhoặc chỉ dùng các đường nối để biểu thị. - Nút gốc: Thường đặt ở trên cùng, có thể đánh dấu
RoothoặcR. - Nút lá: Đánh dấu
Leafhoặc để trống nếu không cần.
3. Các Bước Vẽ B‑Cây Chi Tiết
Bước 1: Vẽ Nút Gốc

Có thể bạn quan tâm: Cách Vẽ Autocad 2026: Hướng Dẫn Chi Tiết Từ Cơ Bản Đến Nâng Cao
- Vẽ một hình chữ nhật (hoặc hình vuông) ở vị trí trung tâm trên cùng của trang.
- Ghi các khóa ban đầu (nếu đã có) vào trong nút, sắp xếp tăng dần.
- Ví dụ: Khi bắt đầu với dãy
10, 20, 30, vàt = 2, nút gốc sẽ chứa10 20 30(có thể chia thành các nút con sau khi chèn thêm). - Ghi nhãn “Root” ở trên hoặc dưới nút để phân biệt.
Bước 2: Xác Định Số Con Cần Vẽ
- Nếu nút đang chứa ít hơn
2t – 1khóa (không đầy), không cần tạo con mới ngay. - Nếu nút đầy (có
2t – 1khóa) và cần chèn thêm một khóa, thực hiện split (chia) trước khi vẽ các con.
Bước 3: Thực Hiện Split (Nếu Cần)
Khi một nút đầy và cần chèn thêm, thực hiện:
- Xác định khóa trung vị (median).
- Với
t = 2và nút có3khóa (k1, k2, k3), median làk2. - Tạo hai nút con:
- Nút trái chứa các khóa nhỏ hơn median.
- Nút phải chứa các khóa lớn hơn median.
- Đưa median lên nút cha (có thể là root hoặc một nút nội bộ khác).
- Nếu node cha cũng đầy, tiếp tục split đệ quy lên trên.
- Vẽ các nút mới: Hai nút con được vẽ dưới node cha, nối bằng các đường thẳng.
Bước 4: Vẽ Các Con
- Vẽ các hình chữ nhật cho mỗi con dưới node cha, sắp xếp theo thứ tự từ trái sang phải.
- Nối các con với node cha bằng các đường thẳng thẳng đứng (hoặc góc vuông) để thể hiện quan hệ cha‑con.
- Ghi các khóa trong mỗi con, sắp xếp tăng dần.
Bước 5: Thêm Khóa Mới (Insert)
Khi chèn một khóa mới k:
- Bắt đầu từ root, đi xuống theo quy tắc phân đoạn:
- Nếu
k<k1(khóa đầu tiên), đi tới conC0. - Nếu
knằm giữakivàk(i+1), đi tới conCi. - Nếu
k>km(khóa cuối), đi tới conCm. - Nếu gặp nút đầy trên đường đi, split nút đó trước khi tiếp tục (điều này được gọi là “pre‑split” để đảm bảo khi tới lá, luôn có chỗ để chèn).
- Khi tới nút lá, chèn
kvào vị trí thích hợp (giữ thứ tự tăng dần), và vẽ lại nút lá với khóa mới.
Bước 6: Xóa Khóa (Delete)
Quá trình xóa phức tạp hơn, gồm các trường hợp:
- Xóa ở nút lá:
- Nếu nút lá vẫn có ít nhất
t – 1khóa sau khi xóa, chỉ cần xóa và vẽ lại. - Nếu nút lá giảm xuống dưới
t – 1, cần borrow (mượn) hoặc merge (hợp nhất) với anh/chị em. - Xóa ở nút nội bộ:
- Thay thế khóa cần xóa bằng predecessor (khóa lớn nhất trong cây con trái) hoặc successor (khóa nhỏ nhất trong cây con phải), sau đó xóa khóa thay thế ở nút lá tương ứng.
- Borrow (mượn):
- Nếu một anh/chị em có nhiều hơn
t – 1khóa, chuyển một khóa qua nút thiếu. - Merge (hợp nhất):
- Khi không thể mượn, hợp nhất nút thiếu với anh/chị em và một khóa của node cha để tạo thành một nút mới có
2t – 1khóa. - Vẽ lại toàn bộ phần cây liên quan sau khi thực hiện borrow/merge.
Bước 7: Kiểm Tra Độ Cân Bằng
Sau mỗi thao tác chèn/xóa, độ sâu của cây (số cấp) nên giữ nguyên hoặc thay đổi ít nhất. Để kiểm tra:
- Đếm số đường thẳng từ root tới các lá khác nhau. Tất cả các lá phải có cùng độ sâu (độ sâu đồng nhất) trong b‑cây chuẩn.
- Nếu phát hiện lá có độ sâu khác nhau, có thể đã có lỗi trong quá trình split/merge.
Bước 8: Hoàn Thiện và Ghi Chú

Có thể bạn quan tâm: Cách Vẽ Anti – Hướng Dẫn Chi Tiết Từ Cơ Bản Đến Nâng Cao
- Ghi chú các bước quan trọng (split, merge) bằng mũi tên, màu khác hoặc ký hiệu (
,→). - Đánh số các bước nếu muốn tạo một chuỗi hướng dẫn chi tiết.
- Kiểm tra lại: Đảm bảo mọi khóa được sắp xếp đúng, các con được nối đúng vị trí và không có nút nào chứa quá hoặc ít hơn số khóa cho phép.
4. Ví Dụ Thực Tế: Vẽ B‑Cây Với t = 2
4.1 Dữ Liệu Đầu Vào
Giả sử chúng ta chèn dãy số sau vào một b‑cây bậc 2 (t = 2):
10, 20, 5, 6, 12, 30, 7, 17
4.2 Các Bước Vẽ
4.2.1 Bước 1: Chèn 10, 20
- Root:
10 20(chưa đầy, vì2t – 1 = 3)
4.2.2 Bước 2: Chèn 5
- Vị trí:
5 < 10→ vào lá. - Root trở thành
5 10 20(đã đầy).
4.2.3 Bước 3: Chèn 6 (Pre‑split)
- Trước khi xuống lá, split root:
- Median là
10. - Tạo Root mới chứa
10. - Hai con:
- C0:
5 - C1:
20
- C0:
- Tiếp tục chèn
6: 6 < 10→ vàoC0.C0hiện có5 6.
4.2.4 Bước 4: Chèn 12
12 > 10→ vàoC1.C1hiện có12 20.
4.2.5 Bước 5: Chèn 30
30 > 10→ vàoC1.C1đầy (12 20 30).
4.2.6 Bước 6: Chèn 7 (Pre‑split)
- Trước khi đi vào
C0, kiểm traC0(5 6) chưa đầy → không split. 7 > 6→ vàoC0, nhưngC0sẽ đầy (5 6 7), vẫn chấp nhận vì max = 3.- Tuy nhiên, khi chèn tiếp
17, sẽ cần split.
4.2.7 Bước 7: Chèn 17
17 > 10→ vàoC1(12 20 30đầy).- Split C1:
- Median là
20. - Nút cha (Root) nhận
20→ Root hiện10 20. - Hai con mới:
- C1‑0:
12 - C1‑1:
30
- C1‑0:
- Tiếp tục chèn
17: 17 > 10và< 20→ vàoC1‑0.C1‑0trở thành12 17.
4.2.8 Kết Quả Cuối Cùng
- Root:
10 20 - C0 (trái của 10):
5 6 7 - C1‑0 (giữa 10 và 20):
12 17 - C1‑1 (phải của 20):
30
4.3 Hình Vẽ
+-----------+ | 10 20 | +-----------+ / | \
+----------------+ +----------------+ +----------------+
| 5 6 7 | | 12 17 | | 30 |
+----------------+ +----------------+ +----------------+
Ghi chú: Khi vẽ, mỗi nút được biểu diễn bằng một hình chữ nhật, các khóa được viết cách nhau bằng một khoảng trống. Các đường thẳng nối từ root tới các con nên thẳng đứng và cân đối.
5. Các Lưu Ý Khi Vẽ B‑Cây

Có thể bạn quan tâm: Cách Vẽ Annie: Hướng Dẫn Chi Tiết Từ Cơ Bản Đến Nâng Cao
5.1 Độ Rộng Của Nút
- Cân đối: Đảm bảo các nút có cùng độ rộng để cây trông gọn gàng.
- Chiều rộng tối đa: Nếu một nút có
2t-1khóa, nên để đủ không gian cho tất cả các khóa, tránh viết chồng lên nhau.
5.2 Đánh Dấu Split và Merge
- Split: Dùng mũi tên lên (
↑) hoặc ký hiệuSở phía trên nút để chỉ ra rằng nút này vừa được tách. - Merge: Dùng ký hiệu
Mhoặc một vòng tròn quanh các nút tham gia hợp nhất.
5.3 Màu Sắc
- Màu xanh: Nút gốc.
- Màu cam: Nút nội bộ.
- Màu tím: Nút lá.
- Màu đỏ: Khóa mới vừa chèn (để theo dõi quá trình).
5.4 Kiểm Tra Lỗi Thông Thường
| Lỗi | Mô tả | Cách khắc phục |
|---|---|---|
Nút có quá 2t‑1 khóa |
Vi phạm quy tắc tối đa | Thực hiện split ngay khi phát hiện |
Nút có ít hơn t‑1 khóa (không phải root) |
Vi phạm tối thiểu | Borrow từ anh/chị em hoặc merge |
| Các lá có độ sâu khác nhau | Cây không cân bằng | Kiểm tra lại quá trình split/merge, đảm bảo pre‑split đúng vị trí |
| Khóa không được sắp xếp | Sai thứ tự | Sắp xếp lại các khóa trong nút sau khi chèn/xóa |
5.5 Sử Dụng Phần Mềm Hỗ Trợ
Nếu bạn muốn vẽ b‑cây trên máy tính, có một số công cụ hữu ích:
- Microsoft Visio / draw.io: Tạo hình chữ nhật, nối đường, tùy chỉnh màu.
- LaTeX + TikZ: Dành cho người thích viết tài liệu khoa học, cho phép tạo cây đẹp và chuẩn xác.
- Graphviz: Dùng ngôn ngữ DOT để mô tả cấu trúc cây, tự động tạo đồ thị.
6. Ứng Dụng Thực Tế Của B‑Cây

6.1 Hệ Thống Quản Lý Cơ Sở Dữ Liệu (DBMS)
- MySQL InnoDB, PostgreSQL, SQLite đều sử dụng b‑cây (hoặc biến thể như B+Tree) để lưu trữ chỉ mục (index).
- Lợi ích: Truy vấn nhanh, giảm số lần I/O, hỗ trợ range queries hiệu quả.
6.2 Hệ Thống Tệp Tin
- NTFS (Windows), ext4 (Linux) sử dụng B+Tree để lưu trữ bảng FAT, inode và các cấu trúc metadata.
- Đảm bảo các file và thư mục có thể được truy cập nhanh ngay cả khi hệ thống chứa hàng triệu mục.
6.3 Cơ Sở Dữ Liệu Nhúng
- Berkeley DB, LevelDB: Dùng B‑Tree hoặc LSM‑Tree để tối ưu cho thiết bị nhúng, điện thoại di động.
6.4 Các Thuật Toán Khác
- Trie + B‑Tree: Kết hợp để xây dựng các hệ thống tìm kiếm từ điển nhanh.
- B‑Tree trong GPU: Nghiên cứu mới cho việc thực hiện các truy vấn trên GPU với B‑Tree.
7. Tổng Kết
Việc vẽ b‑cây không chỉ là một hoạt động minh hoạ mà còn là công cụ quan trọng giúp chúng ta:
- Hiểu sâu cấu trúc và nguyên tắc hoạt động của b‑cây.
- Xác định lỗi trong các thuật toán chèn, xóa, split, merge.
- Truyền đạt kiến thức cho người khác một cách trực quan.
- Thiết kế các hệ thống lưu trữ dữ liệu hiệu quả, giảm thiểu chi phí I/O.
Bằng cách tuân thủ các bước từ chuẩn bị, xác định bậc, thực hiện split/merge, tới việc kiểm tra độ cân bằng, bạn sẽ có thể vẽ một b‑cây chuẩn xác và đẹp mắt trên giấy hoặc trên phần mềm. Hãy luyện tập với các dãy dữ liệu khác nhau, thay đổi bậc t, và thử áp dụng vào các trường hợp thực tế như thiết kế chỉ mục trong cơ sở dữ liệu – bạn sẽ nhanh chóng nắm vững và sử dụng b‑cây một cách thành thạo.
Chúc bạn thành công!
