2. 5.1. Định nghĩa
Cây
Câ là một cấu t ú t
ột ấ trúc trong đó b gồm các nút đượ
bao ồ á út được
liên kết với nhau theo hệ thống phân cấp, trong đó nút
có cấp cao nhất được gọi là nút gốc và nút có cấp thấp
nhất được gọi là các nút lá
lá.
19/12/2008 Cấu trúc dữ liệu 1 2
4. 5.1. Định nghĩa
• Thuật ngữ:
- Nút cha (parents node) của một node là nút có cấp
cao hơn nó một bậc
bậc.
- Nút con (child node) của một node là nút có cấp nhỏ
hơn nó một bậc
bậc.
- Nút gốc (root) là nút không có nút cha.
- Nút lá (leaf – leaves) là nút không có nút con.
- Cấp của 1 nút (level of a node) là các liên kết để đi
p ( )
từ nút gốc đến nút đó.
19/12/2008 Cấu trúc dữ liệu 1 4
5. 5.2. Cây nhị phân
5.2.1.
5 2 1 Khái niệm về cây nhị phân
Cây nhị phân là một cây mà mỗi nút có không quá 2 nút
ỗ
con
19/12/2008 Cấu trúc dữ liệu 1 5
6. 5.2. Cây nhị phân tìm kiếm
5.2.2.
5 2 2 Cây nhị phân tìm kiếm
Cây nhị phân tìm kiếm là một cây nhị phân trong đó nút
của nó được tổ chức để luôn thỏa tính chất sau đây “Giá
Giá
trị của nút cha luôn lớn hơn giá trị tất cả nút con bên
trái và nhỏ hơn giá trị của tất cả nút con bên phải”.
19/12/2008 Cấu trúc dữ liệu 1 6
8. 5.2. Cây nhị phân
5.2.2.
5 2 2 Cây nhị phân tìm kiếm
Biểu diễn cây nhị phân tìm kiếm
struct Node
{
int key;
Node * left, * right;
};
typedef Node *pNode;
struct T
t t Tree
{
pNode root;
};
19/12/2008 Cấu trúc dữ liệu 1 8
9. 5.2. Cây nhị phân
5.2.2.
5 2 2 Cây nhị phân tìm kiếm
Các thao tác trên cây nhị phân tìm kiếm
Khởi tạo cây
void
id Initial (
iti l (Tree &t)
t)
{
t.root = NULL;
}
Kiểm tra cây rỗng
int isEmpty (Tree t)
{
return (t root == NULL);
(t.root
}
19/12/2008 Cấu trúc dữ liệu 1 9
10. 5.2. Cây nhị phân
5.2.2.
5 2 2 Cây nhị phân tìm kiếm
Các thao tác trên cây nhị phân tìm kiếm
Thêm một nút vào cây
Giả sử cần thêm 1 nút có khóa k vào cây t.
- So sánh với nút gốc: nếu nhỏ hơn thì sang trái lớn hơn
trái,
thì sang phải.
- So sánh với nút gốc của cây con bên trái (phải) và lặp
lại quá trình trên cho đến khi tìm được vị trí thích hợp.
19/12/2008 Cấu trúc dữ liệu 1 10
11. 5.2. Cây nhị phân
5.2.2.
5 2 2 Cây nhị phân tìm kiếm
Các thao tác trên cây nhị phân tìm kiếm
Thêm ộ ú à â
Thê một nút vào cây
int Ins (pNode &r, int k)
{
if (!r) //r==NULL
//
{
pNode p = new Node;
p -> key = k;
>
p -> left = p -> right = NULL;
r = p;
return 1;
}
if (r -> key == k)return 0;
if (r -> key > k) return Ins (r->left,k);
( y ) ( , )
else return Ins (r->right,k);
}
19/12/2008 Cấu trúc dữ liệu 1 11
12. 5.2. Cây nhị phân
5.2.2.
5 2 2 Cây nhị phân tìm kiếm
Các thao tác trên cây nhị phân tìm kiếm
Thêm một nút vào cây
int
i t Insert (
t (Tree &t, i t k)
t int
{
return Insert (t.root,k);
}
19/12/2008 Cấu trúc dữ liệu 1 12
13. 5.2. Cây nhị phân
5.2.2.
5 2 2 Cây nhị phân tìm kiếm
Các thao tác trên cây nhị phân tìm kiếm
Thêm một nút vào cây
int
i t Insert (
t (Tree &t, i t k)
t int
{
return Ins (t.root,k);
}
19/12/2008 Cấu trúc dữ liệu 1 13
14. 5.2. Cây nhị phân
5.2.2.
5 2 2 Cây nhị phân tìm kiếm
Các thao tác trên cây nhị phân tìm kiếm
Tạo cây
void CreateTree (Tree &t)
{
int k;
do
{
cout<<"Nhap nut can them: “;cin>>k;
if (k!=-1)
if (Insert(t k))
(Insert(t,k))
cout<<"Thanh cong"<<endl;
else
cout<< Nut
cout<<"Nut da co trong cay"<<endl;
cay <<endl;
}while (k!=-1);
}
19/12/2008 Cấu trúc dữ liệu 1 14
16. 5.2. Cây nhị phân
5.2.2.
5 2 2 Cây nhị phân tìm kiếm
Các thao tác trên cây nhị phân tìm kiếm
Duyệt cây
void LNR (pNode r)
{
if (!r)
return;
lnr(r->left);
cout<<r->key<<" ";
lnr(r->right);
}
void LNR(Tree t)
{
LNR(t.root);
LNR(t t)
}
19/12/2008 Cấu trúc dữ liệu 1 16
17. 5.2. Cây nhị phân
5.2.2.
5 2 2 Cây nhị phân tìm kiếm
Các thao tác trên cây nhị phân tìm kiếm
Tìm khóa k có trong cây hay không
int Search(pNode r,int k)
{
if (!r) return 0;
if (r->key == k) return 1;
if (r->key > k)
return Search(r->left,k);
else
return Search(r->right,k);
}
int Search(Tree t,int k)
{
return Search(t.root,k);
}
19/12/2008 Cấu trúc dữ liệu 1 17
18. 5.2. Cây nhị phân
5.2.2.
5 2 2 Cây nhị phân tìm kiếm
Các thao tác trên cây nhị phân tìm kiếm
Xóa một nút X
- X là nút lá: chỉ đơn giản hủy X vì nó không móc nối
đến hầ
đế phần tử nào khá
à khác.
19/12/2008 Cấu trúc dữ liệu 1 18
19. 5.2. Cây nhị phân
5.2.2.
5 2 2 Cây nhị phân tìm kiếm
Các thao tác trên cây nhị phân tìm kiếm
Xóa một nút X
- X chỉ có 1 nút con: trước khi hủy X ta móc nối cha của
X với con d nhất của nó.
ới duy hấ ó
19/12/2008 Cấu trúc dữ liệu 1 19
20. 5.2. Cây nhị phân
5.2.2.
5 2 2 Cây nhị phân tìm kiếm
Các thao tác trên cây nhị phân tìm kiếm
Xóa một nút X
- X có đủ cả 2 con: không thể hủy trực tiếp do X có đủ 2
con ⇒ hủy gián tiếp. Thay vì hủy X, ta sẽ tìm một phần
ế ầ
tử thế mạng Y. Phần tử này có tối đa một con. Thông tin
lưu tại
l t i Y sẽ đ
ẽ được chuyển lê l t i X S đó nút bị
h ể lên lưu tại X. Sau đó, út
hủy thật sự sẽ là Y giống như 2 trường hợp đầu. Vấn đề
là phải chọn Y sao cho khi lưu Y vào vị trí của X cây
X,
vẫn là CNPTK. Có 2 phần tử thỏa mãn yêu cầu:
+ Phần tử nhỏ nhất (trái nhất) trên cây con phải
phải.
+ Phần tử lớn nhất (phải nhất) trên cây con trái.
19/12/2008 Cấu trúc dữ liệu 1 20
21. 5.2. Cây nhị phân
5.2.2.
5 2 2 Cây nhị phân tìm kiếm
Có thể dùng 15
để thế mạng
19/12/2008 Cấu trúc dữ liệu 1 21
22. 5.2. Cây nhị phân
5.2.2.
5 2 2 Cây nhị phân tìm kiếm
Có thể dùng 15
để thế mạng
19/12/2008 Cấu trúc dữ liệu 1 22
23. 5.2. Cây nhị phân
5.2.3.
5 2 3 Cây nhị phân cân bằng
Định nghĩa
Cây cân bằng hoàn toàn là cây nhị phân tìm kiếm mà
tại mỗi nút của nó, số nút của cây con trái chênh lệch
không quá một so với số nút của cây con phải.
kh á ới ố ú h i
Cây Cân Bằng Hoàn Toàn
Cây CCBHT thì h ~ log2n
Cây nhị phân tìm kiếm cân bằng hoàn toàn
19/12/2008 Cấu trúc dữ liệu 1 23
24. 5.2. Cây nhị phân
5.2.3.
5 2 3 Cây nhị phân cân bằng
Nhận xét
• Một cây rất khó đạt được trạng thái cân bằng hoàn toàn và cũng
rất dễ mất cân bằng vì khi thêm hay hủy các nút trên cây có thể
làm cây mất cân bằng (xác suất rất lớn), chi phí cân bằng lại cây
ấ ằ ấ ấ ằ
lớn vì phải thao tác trên toàn bộ cây.
• Trong trường hợp xấu nhất ta chỉ phải tìm qua log2n phần tử (n
là số nút trên cây).
• Do CCBHT là một cấu trúc kém ổn định nên trong thực tế không
thể sử dụng. Nhưng ưu điểm của nó lại rất quan trọng. Vì vậy, cần
đưa ra một CTDL khác có đặc tính giống CCBHT nhưng ổn định
hơn.
h
19/12/2008 Cấu trúc dữ liệu 1 24
25. 5.2. Cây nhị phân
5.2.3.
5 2 3 Cây nhị phân cân bằng
Cây AVL (Adelson – Velskii – Landiis)
Định nghĩa: Cây nhị phân tìm kiếm cân bằng là cây mà
tại mỗi nút của nó độ cao của cây con trái và của cây con
ạ ộ y y
phải chênh lệch không quá một.
Cây AVL
Cây nhị phân tìm kiếm cân bằng AVL
19/12/2008 Cấu trúc dữ liệu 1 25
26. 5.2. Cây nhị phân
5.2.3.
5 2 3 Cây nhị phân cân bằng
Cây AVL (Adelson – Velskii – Landiis)
Khai báo:
struct Node
{
int key;
int bal; //-1: lệch trái, 0: cân bằng, 1: lệch phải
Node *left,*right;
};
19/12/2008 Cấu trúc dữ liệu 1 26
28. 5.2. Cây nhị phân
5.2.3.
5 2 3 Cây nhị phân cân bằng
Cây AVL (Adelson – Velskii – Landiis)
Các trường hợp mất cân bằng:
• Trường hợp 1: cây T lệch về bên trái (có 3 khả năng)
g ợp y ệ ( g)
19/12/2008 Cấu trúc dữ liệu 1 28
29. 5.2. Cây nhị phân
5.2.3.
5 2 3 Cây nhị phân cân bằng
Cây AVL (Adelson – Velskii – Landiis)
Các trường hợp mất cân bằng:
• Trường hợp 2: cây T lệch về bên phải (có 3 khả năng)
g ợp y ệ p ( g)
19/12/2008 Cấu trúc dữ liệu 1 29
30. 5.2. Cây nhị phân
5.2.3.
5 2 3 Cây nhị phân cân bằng
Cây AVL (Adelson – Velskii – Landiis)
Các trường hợp mất cân bằng:
• Hướng giải quyết của 2 trường hợp là tương tự nhau nên ta
gg q y g ợp g ự
chỉ giải quyết Trường hợp 1
19/12/2008 Cấu trúc dữ liệu 1 30
31. 5.2. Cây nhị phân
5.2.3.
5 2 3 Cây nhị phân cân bằng
Cây AVL (Adelson – Velskii – Landiis)
Các trường hợp mất cân bằng:
19/12/2008 Cấu trúc dữ liệu 1 31
32. 5.2. Cây nhị phân
5.2.3.
5 2 3 Cây nhị phân cân bằng
Cây AVL (Adelson – Velskii – Landiis)
Các trường hợp mất cân bằng:
19/12/2008 Cấu trúc dữ liệu 1 32