Cây là gì?
Cây là một tập hợp T rỗng hoặc gồm nhiều phần tử được gọi là nút, trong đó:
- Một nút được gọi là nút gốc.
- Các nút còn lại được phân chia thành m nhóm (m >= 0) mỗi nhóm là một cây và được gọi là cây con.
Một cây không có một nút nào cả gọi là cây rỗng và được ký hiệu là /\.
Thế còn cây nhị phân?
Bậc của nút là số cây con của nút đó.
Bậc của cây là bậc lớn nhất của các nút của cây. Nếu cây có bậc là n thì ta gọi là cây n-phân.
Vậy cây nhị phân là cây có bậc bằng 2? Đúng vậy.
Và thế nào là cây nhị phân tìm kiếm?
Cây nhị phân tìm kiếm (binary search tree) là cây nhị phân mà tại mỗi nút của cây thì giá trị (thường được gọi là khoá) của nút này lớn hơn khoá của các nút của cây con bên trái và nhỏ hơn khoá của các nút của cây con bên phải của nó.
Nếu ta gọi:
KN - khoá của nút gốc.
KL - khoá của nút con bên trái.
KR - khoá của nút con bên phải.
Thì:
KL < KN < KR
Cấu trúc một nút gồm các trường (thông tin) sau:
- Key (hay Info): chứa nội dung của nút.
- Left: là con trỏ chỉ nút con bên trái.
- Right: là con trỏ chí nút con bên phải.
Việc quản lý cây nhị phân tìm kiếm thông qua con trỏ chỉ nút gốc (Root)
Khai báo kiểu (của một số ngôn ngữ lập trình):
//Pascal
type
ref = ^node;
node = record
Key: integer;
Left,Right: ref;
end;
//C/C++
typedef struct strNode
{
int Key;
strNode *Left, *Right;
}NODE;
//Visual Basic
Type MyNode
Key As Integer
Left As Variant
Right As Variant
End Type
Duyệt cây
Phép duyệt cây là lần lượt đi qua tất cả các nút của cây và mỗi nút chỉ được duyệt một lần.
Có 6 phép duyệt cây dựa vào thứ tự duyệt của các nút bên trái (L), nút gốc (N), các nút bên phải (R) là:
- Thứ tự Preorder: NLR, NRL (nút gốc trước tiên)
- Thứ tự Inorder: LNR, RNL (nút gốc ở giữa)
- Thứ tự Postorder: LRN, RLN (nút gốc sau cùng)
Ta nhận thấy các phép duyệt có tính đối xứng nên ta chỉ xét đến 3 phép duyệt cơ bản là NLR (gốc, trái, phải), LNR (trái, gốc, phải), LRN (trái, phải, gốc).
Tìm kiếm
Đúng như tên gọi cây nhị phân tìm kiếm, cấu trúc của loại cây này giúp cho việc tìm kiếm 1 giá trị trên cây trở nên nhanh chóng và dễ dàng.
Giải thuật tìm kiếm được thực hiện theo các bước như sau:
- Bước 1: Bắt đầu từ nút p là nút gốc.
- Bước 2: Tại nút p này, ta xét:
o Nếu (p->Key = x) thì nút cần tìm là nút p. Giải thuật tìm kiếm kết thúc thành công.
o Nếu (p->Key > x) thì ta đi đến nút con bên trái, gọi là nút q.
o Nếu (p->Key < x) thì ta đi đến nút con bên phải, gọi là nút q.
- Bước 3:
o Nếu (q = NULL) thì giải thuật kết thúc không thành công (không tìm thấy).
o Ngược lại thì cho p = q và lập lại bước 2.
Bookmarks