Nội dung
 Cấu trúc cây
 Cây nhị phân
 Cây nhị phân tìm kiếm
 Cây nhị phân tìm kiếm cân bằng AVL
 Phần mở rộng (cây n-phân)
 Cây Top-Down
 B-Tree
Cấu trúc cây
 Tập hợp các nút và cạnh nối các nút đó
 Có một nút gọi là gốc
 Quan hệ one-to-many giữa các nút
 Có duy nhất một đường đi từ gốc đến một nút
 Các loại cây:
 Nhị phân: mỗi nút có {0,1, 2} nút con
 Tam phân: mỗi nút có {0,1,2,3} nút con
 n-phân: mỗi nút có {0,1,..,n} nút con
                
              
                                            
                                
            
 
            
                
103 trang | 
Chia sẻ: candy98 | Lượt xem: 1446 | Lượt tải: 1
              
            Bạn đang xem trước 20 trang tài liệu Bài giảng Cấu trúc dữ liệu và Giải thuật - Chương 5: Cấu trúc cây - Nguyễn Hà Giang, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Nguyễn Hà Giang - 2009 1
Tree Structure
ThS. Nguyễn Hà Giang
Hutech - FIT
Nguyễn Hà Giang - 2009 2
Nội dung
 Cấu trúc cây
 Cây nhị phân
 Cây nhị phân tìm kiếm
 Cây nhị phân tìm kiếm cân bằng AVL
 Phần mở rộng (cây n-phân)
 Cây Top-Down
 B-Tree
Nguyễn Hà Giang - 2009 3
Cấu trúc dữ liệu
Nguyễn Hà Giang - 2009 4
Cấu trúc cây
 Tập hợp các nút và cạnh nối các nút đó
 Có một nút gọi là gốc
 Quan hệ one-to-many giữa các nút
 Có duy nhất một đường đi từ gốc đến một nút
 Các loại cây:
 Nhị phân: mỗi nút có {0,1, 2} nút con
 Tam phân: mỗi nút có {0,1,2,3} nút con
 n-phân: mỗi nút có {0,1,..,n} nút con
Nguyễn Hà Giang - 2009 5
Cấu trúc cây
Sao trong máy 
tính, cây lại 
thể hiện 
ngược?
Nguyễn Hà Giang - 2009 6
Khái niệm
J
Z A
DRB
LFAKQ Lá
nút
gốc
Cạnh
Nguyễn Hà Giang - 2009 7
Khái niệm
 Thuật ngữ
 Nút gốc: không có nút cha
 Nút lá: không có nút con
 Nút trong: tất cả các nút không phải nút lá
 Chiều cao: khoảng cách từ gốc đến lá
Chiều cao
Nút gốc
Nút trong
Nút lá
Nguyễn Hà Giang - 2009 8
Khái niệm
Root
Node A
Node H
Node B
Node GNode FNode ENode DNode C
Node KNode J
Node L
Node I
Cây con Nút anh em
Nguyễn Hà Giang - 2009 9
Nội dung
 Cấu trúc cây
 Cây nhị phân
 Cây nhị phân tìm kiếm
 Cây nhị phân tìm kiếm cân bằng AVL
Nguyễn Hà Giang - 2009 10
Binary Tree
 Cấu trúc cây đơn giản nhất
 Tại mỗi nút gồm các 3 thành phần
 Phần data: chứa giá trị, thông tin
 Liên kết đến nút con trái (nếu có)
 Liên kết đến nút con phải (nếu có)
 Cây nhị phân có thể rỗng (ko có nút nào)
 Cây NP khác rỗng có 1 nút gốc
 Có duy nhất 1 đường đi từ gốc đến 1 nút 
 Nút không có nút con bên trái và con bên phải là 
nút lá
Nguyễn Hà Giang - 2009 11
Binary Tree
A
B C
D E F
IH
G
Độ sâu/chiều cao = 3
Kích thước = 9 (số nút)
Cây con trái Cây con phải
Mức 1
Mức 2
Mức 3
Mức 0
Nguyễn Hà Giang - 2009 12
Binary Tree
 Cây nhị phân đúng:
 Nút gốc và nút trung gian có đúng 2 con
 Cây nhị phân đúng có n nút lá thì số nút trên 
cây 2n-1 
A
B C
D E F G
H I J K
Nguyễn Hà Giang - 2009 13
Binary Tree
 Cây nhị phân đầy đủ với chiều sâu d
 Phải là cây nhị phân đúng
 Tất cả nút lá có chiều sâu d
A
B C
D E F G
Số nút = (2d+1 -1)
Số nút trung gian = ?
Biết số nút tính d của cây NP đầy đủ
Nguyễn Hà Giang - 2009 14
Binary Tree
 Duyệt cây:
 Do cây là cấu trúc ko tuyến tính
 3 cách duyệt cây NP
 Duyệt theo thứ tự trước PreOrder: NLR
 Duyệt theo thứ tự giữa InOrder: LNR
 Duyệt theo thứ tự sau PostOrder: LRN
Nguyễn Hà Giang - 2009 15
Binary Tree
A
B C
D E F G
H I J K
PreOrder: 
InOrder:
PostOrder:
Nguyễn Hà Giang - 2009 16
Binary Tree
 Cài đặt cây NP dùng liên kết
typedef struct node
{
DataType info;
struct node * left;
struct node * right;
} NODE;
typedef NODE * NodePtr;
NodePtr pTree; Trỏ nút gốc của cây NP
Cấu trúc của một nút
Chứa thông tin của nút
Trỏ đến nút con trái
Trỏ đến nút con phải
Nguyễn Hà Giang - 2009 17
Binary Tree
8
5 10
1 3 4
79
20
pTree
Con trỏ pTree trỏ 
đến nút gốc của cây
Nguyễn Hà Giang - 2009 18
Binary Tree
 Các thao tác:
 NewNode, CreateNode, FreeNode, Init, IsEmpty
 InsertLeft, InsertRight
 DeleteLeft, DeleteRight
 PreOrder, InOrder, PostOrder
 Search
 ClearTree
Phần minh 
hoạ dùng
DataType là 
kiểu int
Nguyễn Hà Giang - 2009 19
Binary Tree
 CreateNode: tạo một nút mới có giá trị là x
NodePtr CreateNode(int x)
{
NodePtr node;
node = NewNode();
node->info = x;
node->left = NULL;
node->right = NULL;
return node;
}
X
node
new
Nguyễn Hà Giang - 2009 20
Binary Tree
 InsertLeft: thêm nút con bên trái nút p
int InsertLeft(NodePtr p, int x)
{
if (p == NULL) return FALSE;
if (p->left != NULL) return FALSE;
p->left = CreateNode(x);
return TRUE;
}
Nguyễn Hà Giang - 2009 21
Binary Tree
 InsertRight: thêm một nút con bên phải p
int InsertRight(NodePtr p, int x)
{
if (p == NULL) return FALSE;
if (p->right != NULL) return FALSE;
p->right = CreateNode(x);
return TRUE;
}
Nguyễn Hà Giang - 2009 22
Binary Tree
 DeleteLeft: xoá nút con bên trái của p, nút này 
phải là nút lá
int DeleteLeft(NodePtr p)
{
NodePtr q;
int value;
if (p == NULL) return -1;
q = p->left;
if (q == NULL) return -1;
if (q->left != NULL || q->right !=NULL)
return -1;
value = q->info;
p->left = NULL;
FreeNode(q);
return value;
}
Nguyễn Hà Giang - 2009 23
Binary Tree
 PreOrder: xuất theo thứ tự trước
void PreOrder(NodePtr pTree)
{
if (pTree != NULL)
{
printf(“%d ”, pTree->info);
PreOrder(pTree->left);
PreOrder(pTree->right);
}
}
Nguyễn Hà Giang - 2009 24
Binary Tree
 InOrder
void InOrder(NodePtr pTree)
{
if (pTree != NULL)
{
InOrder(pTree->left);
printf(“%d ”, pTree->info);
InOrder(pTree->right);
}
}
Nguyễn Hà Giang - 2009 25
Binary Tree
 PostOder
void PostOrder(NodePtr pTree)
{
if (pTree != NULL)
{
PostOrder(pTree->left);
PostOrder(pTree->right);
printf(“%d ”, pTree->info);
}
}
Nguyễn Hà Giang - 2009 26
Binary Tree
 Search: tìm nút có khoá x
NodePtr Search(NodePtr pTree, int x)
{
NodePtr p;
if (pTree == NULL) return NULL;
if (pTree->info == x) return pTree;
p = Search(pTree->left, x);
if (p == NULL)
p = Search(pTree->right, x);
return p;
}
Nguyễn Hà Giang - 2009 27
Binary Tree
 ClearTree: xóa lần lượt nút bên trái, bên phải 
và nút cha.
void ClearTree(NodePtr pTree)
{
if (pTree != NULL)
{
ClearTree(pTree->left);
ClearTree(pTree->right);
FreeNode(pTree);
}
}
Nguyễn Hà Giang - 2009 28
Binary Tree
 Các thao tác mở rộng khác:
1. Đếm số nút lá: CountLeaf
2. Đếm số nút trên cây: CountNode
3. Đếm số nút trong: CountInnerNode
4. Xác định độ sâu/chiều cao của cây
5. Tìm giá trị nhỏ nhất/lớn nhất trên cây
6. Tính tổng các giá trị trên cây
7. Đếm số nút có giá trị bằng x
Nguyễn Hà Giang - 2009 29
Nội dung
 Cấu trúc cây
 Cây nhị phân
 Cây nhị phân tìm kiếm
 Cây nhị phân tìm kiếm cân bằng AVL
Nguyễn Hà Giang - 2009 30
Binary Search Tree
 BST là cây nhị phân mà mỗi nút thoả
 Giá trị của tất cả nút con trái < nút gốc
 Giá trị của tất cả nút con phải > nút gốc 
5
3
1 4
10
8 20
 5
Nguyễn Hà Giang - 2009 31
Binary Search Tree
 Ví dụ
Binary 
search trees
Non-binary 
search tree
5
10
30
2 25 45
5
10
45
2 25 30
5
10
30
2
25
45
Nguyễn Hà Giang - 2009 32
Binary Search Tree
5
10
30
2 25 458
3 6 9 14 33 66
x = 9
10>9, left
5<9, right
8<9, right
9=9, Tìm thấy
5<9
8<9
9=9
Nguyễn Hà Giang - 2009 33
Binary Search Tree
 Tìm (2)
5
10
30
2 25 45
5
10
30
2
25
45
10 > 2, left
5 > 2, left
2 = 2, found
5 > 2, left
2 = 2, found
Nguyễn Hà Giang - 2009 34
Binary Search Tree
 Tìm (25)
5
10
30
2 25 45
5
10
30
2
25
45
10 < 25, right
30 > 25, left
25 = 25, found
5 < 25, right
45 > 25, left
30 > 25, left
10 < 25, right
25 = 25, found
Nguyễn Hà Giang - 2009 35
Binary Search Tree
 Thời gian tìm kiếm
 Dựa trên chiều cao của cây
 Cây cân bằng
 O(log(n))
 Cây ko cân bằng
 O(n)
 Tương tự tìm kiếm trên danh sách, mảng ko sắp
Nguyễn Hà Giang - 2009 36
Binary Search Tree
 Search
 Xuất phát từ gốc
 Nếu nút = NULL  ko tìm thấy
 Nếu khoá x = khóa nút gốc  tìm thấy
 Ngược lại nếu khoá x < khoá nút gốc  Tìm trên cây 
bên trái
 Ngược lại  tìm trên cây bên phải
Nguyễn Hà Giang - 2009 37
Binary Search Tree
 Search
NodePtr Search(NodePtr node, int x)
{
NodePtr p = node;
if (p != NULL) 
if (node->info > x)
p = Search(node->left, x);
else if (node->info < x)
p = Search(node->right, x);
return p;
}
Nguyễn Hà Giang - 2009 38
Binary Search Tree
 Xây dựng cây BST
 Chèn
 Xóa
 Luôn duy trì tính chất
 Giá trị nhỏ hơn ở bên cây con trái
 Giá trị lớn hơn ở bên cây con phải
Nguyễn Hà Giang - 2009 39
Binary Search Tree
 Insert
 Thực hiện tìm kiếm giá trị x
 Tìm đến cuối nút Y (nếu x ko 
tồn tại trong cây)
 Nếu x < y, thêm nút lá x bên trái 
của Y
 Nếu x > y, thêm nút lá x bên 
phải của Y
5
10
30
2 25 45
20
Y
X
mới
Nguyễn Hà Giang - 2009 40
Binary Search Tree
void Insert(NodePtr pTree, int x) {
NodePtr node;
if ( pTree == NULL) return;
if (pTree->info == x) return;
if (pTree->info > x) { // nhánh trái
if (pTree->left == NULL) {
node = CreateNode(x); pTree->left = node;
}
else Insert(pTree->left, x);
} // nhánh phải
else
if (pTree->right == NULL) { // hết đường đi
node = CreateNode(x); pTree->right = node;
}
else Insert(pTree->right, x);
}
Nguyễn Hà Giang - 2009 41
Binary Search Tree
 Delete: xóa nhưng phải đảm bảo vẫn là cây BST
 Thực hiện tìm nút có giá trị x
 Nếu nút là nút lá, delete nút
 Ngược lại
 Thay thế nút bằng một trong hai nút sau
 Y là nút lớn nhất của cây con bên trái
 Z là nút nhỏ nhất của cây con bên phải
 Chọn nút Y hoặc Z để thế chỗ
 Giải phóng nút
Nguyễn Hà Giang - 2009 42
Binary Search Tree
 Trường hợp 1: nút p là nút lá, xoá bình thường
5
10
30
2 25 45
5
10
30
2 45
Xóa 25
Nguyễn Hà Giang - 2009 43
Binary Tree Search
 Trường hợp 2: p chỉ có 1 cây con, cho nút cha 
của p trỏ tới nút con duy nhất của nó, rồi hủy p
5
10
30
2 25 45
Xóa 5
10
30
2 25 45
Nguyễn Hà Giang - 2009 44
Binary Search Tree
 Trường hợp 3: nút p có 2 cây con, chọn nút 
thay thế theo 1 trong 2 cách như sau
 Nút lớn nhất trong cây con bên trái
 Nút nhỏ nhất trong cây con bên phải
Nút lớn 
bên trái
Nút nhỏ 
bên phải
Nguyễn Hà Giang - 2009 45
Binary Search Tree
 Delete: nút 10 cách 1 
5
10
30
2 25 45
50
55 5
30
2 25 45
50
55
Xóa 10
Chọn nút có khoá 
lớn nhất bên trái
Nguyễn Hà Giang - 2009 46
Binary Search Tree
 Delete: nút 10 cách 2
5
10
30
2 25 45
50
55
Xóa 10
5
25
30
2 45
50
55
Chọn nút nhỏ nhất bên phải
Nguyễn Hà Giang - 2009 47
Binary Search Tree
 Minh họa xóa (25)
52
25 66
15 39
9 19 27 42
31
60 99
58 62
P
Nguyễn Hà Giang - 2009 48
Binary Search Tree
 Minh họa xóa (25)
52
25 66
15 39
9 19 27 42
31
60 99
58 62
P
rp
f
Nguyễn Hà Giang - 2009 49
Binary Search Tree
 Minh họa xóa (25)
52
27 66
15 39
9 19 27 42
31
60 99
58 62
P
rp
f
mới
Nguyễn Hà Giang - 2009 50
Binary Search Tree
 Minh họa xóa (25)
52
27 66
15 39
9 19 25 42
31
60 99
58 62
P
f
mới
Nguyễn Hà Giang - 2009 51
Binary Search Tree
 Minh họa xóa (25)
52
27 66
15 39
9 19 31 42
60 99
58 62
P
f
mới
Nguyễn Hà Giang - 2009 52
Binary Search Tree
25
15 39
9 19 42
P
rp
f Trường hợp đặc biệt:
f == p
Nút thế mạng rp là nút 
con phải của nút p cần 
xoá
52
Nguyễn Hà Giang - 2009 53
Binary Search Tree
39
15 39
9 19 42
P
rp
f Trường hợp đặc biệt:
f == p
Nút thế mạng rp là nút 
con phải của nút p cần 
xoá
- Đưa giá trị của nút rp 
lên nút p
52
Nguyễn Hà Giang - 2009 54
Binary Search Tree
39
15 39
9 19 42
P
rp
f Trường hợp đặc biệt:
f == p
Nút thế mạng rp là nút 
con phải của nút p cần 
xoá
- Chuyển liên kết phải 
của p đến liên kết phải 
của rp
52
Nguyễn Hà Giang - 2009 55
Binary Search Tree
39
15 39
9 19 42
P
rp
f Trường hợp đặc biệt:
f == p
Nút thế mạng rp là nút 
con phải của nút p cần 
xoá
- Xoá nút rp
52
Nguyễn Hà Giang - 2009 56
Binary Search Tree
39
15
9 19
42
P
f Trường hợp đặc biệt:
f == p
Nút thế mạng rp là nút 
con phải của nút p cần 
xoá
- Sau khi xoá
52
Nguyễn Hà Giang - 2009 57
Binary Search Tree
 Remove (NodePtr &T, int x)
 Nếu T = NULL  thoát
 Nếu T->info > x  Remove(T->left, x)
 Nếu T->info right, x)
 Nếu T->info = x
 P = T 
 Nếu T có 1 nút con thì T trỏ đến nút con đó
 Ngược lại có 2 con
 Gọi f = p và rp = p->right;
 Tìm nút rp sao cho rp->left = null và nút f là nút cha nút rp
 Thay đổi giá trị nội dung của T và rp
 Nếu f = p (trường hợp đặc biệt) thì: f->right = rp->right;
 Ngược lại: f->left = rp->right;
 P = rp; // p trỏ tới rp để xoá
 Xoá P
Nguyễn Hà Giang - 2009 58
Binary Search Tree
int Remove(NodePtr &T, int x)
{
if ( T == NULL) 
return FALSE; // không tìm thấy nút cần xoá
if (T->info >x) // tìm bên trái
return Remove(T->left, x); 
if (T->info <x) // tìm bên phải
return Remove(T->right, x);
NodePtr p, f, rp;
p = T; // p biến tạm trỏ đến T
if ( T->left == NULL) // có 1 cây con
T = T->right;
else if (T->right == NULL) // có 1 cây con
T = T->left;
Nguyễn Hà Giang - 2009 59
Binary Search Tree
else { // trường hợp có 2 con chọn nút nhỏ nhất bên con phải
f = p; // f để lưu cha của rp
rp = p->right; // rp bắt đầu từ p->right
while ( rp->left != NULL) 
{ 
f = rp; // lưu cha của rp
rp = rp->left; // rp qua bên trái
} // kết thúc khi rp là nút có nút con trái là null
p->info = rp->info; // đổi giá trị của p và rp
if ( f == p) // nếu cha của rp là p
f->right = rp->right; 
else // f != p
f->left = rp->right;
p = rp; // p trỏ đến phần tử thế mạng rp
}
FreeNode(p); // xoá nút p
return TRUE;
Nguyễn Hà Giang - 2009 60
Binary Search Tree
 Bài tập
 Cài đặt cấu trúc dữ liệu liên kết cho cây nhị phân tìm kiếm
 Cài đặt các thao tác xây dựng cây: NewNode, Init, IsEmpty, 
CreateNode
 Cài đặt thao tác cập nhật: Insert, Remove, ClearTree
 Xuất danh sách tăng dần và giảm dần
 Kiểm tra xem cây có phải là cây nhị phân đúng
 Kiểm tra xem cây có phải là cây nhị phân đầy đủ
 Xác định nút cha của nút chứa khoá x
 Đếm số nút lá, nút giữa, kích thước của cây
 Xác định độ sâu/chiều cao của cây
 Tìm giá trị nhỏ nhất/lớn nhất trên cây
 Tính tổng các giá trị trên cây
Nguyễn Hà Giang - 2009 61
Mở rộng BST
 Quá trình cập nhật cây nhị phân tìm kiếm
thường làm cây mất cân bằng
 Thao tác:
 Xoay trái RotateLeft
 Xoay phải RotateRight
Nguyễn Hà Giang - 2009 62
Mở rộng BST
 RotateLeft
r
a
p
b c
Xoay trái nút r
Cây con a
Cây con b
Cây con c
Nút p sẽ trở thành
nút gốc sau khi xoay
Nguyễn Hà Giang - 2009 63
Mở rộng BST
 RotateLeft
r
a
p
b c
p
c
r
a b
Sau khi xoay
Nguyễn Hà Giang - 2009 64
Mở rộng BST
 Minh họa xoay trái
22
4 45
32
25
76
50 99
60
Nguyễn Hà Giang - 2009 65
Mở rộng BST
 Minh họa xoay trái
22
4 45
32
25
76
50 99
60
pRoot
p
Nguyễn Hà Giang - 2009 66
Mở rộng BST
 Minh họa xoay trái
22
4 45
32
25
76
50 99
60
pRoot
p
Nguyễn Hà Giang - 2009 67
Mở rộng BST
 Minh họa xoay trái
22
4 45
32
25
76
50 99
60
pRoot
p
Nguyễn Hà Giang - 2009 68
Mở rộng BST
 Minh họa xoay trái
22
4
45
32
25
76
50 99
60
pRoot
p
Gốc mới
Nguyễn Hà Giang - 2009 69
Mở rộng BST
 Thủ tục RotateLeft xoay nút root qua trái và trả về địa 
chỉ của nút gốc mới (thay cho root).
 NodePtr RotateLeft(NodePtr root)
Nếu pRoot khác rỗng & có cây con phải
p = root->right
root->right = p->left
p->left = root
return p
return NULL
Nguyễn Hà Giang - 2009 70
Mở rộng BST
 Sử dụng thủ tục RotateLeft
 Xoay trái toàn cây nhị phân: trả về con trỏ là nút gốc mới 
của cây
 pTree = RotateLeft(pTree)
 Xoay trái nhánh cây con bên trái của p: trả về con trỏ đến 
nút gốc mới của nhánh này
 p->left = RotateLeft(p->left)
 Xoay trái nhánh cây con bên phải của p:
 P->right = RotateLeft(p->right)
 Lưu ý: phải cập nhật link từ nút cha đến nút gốc mới
 Ví dụ xoay nút p, trong đó p trỏ đến nút con trái của f
 p = RotateLeft(p) // xoay trái nút p
 f->left = p // cập nhật lại link từ nút cha đến nút gốc mới
Nguyễn Hà Giang - 2009 71
Mở rộng BST
 RotateRight
r
c
p
a b
p
a
r
b c
Sau khi xoay phải
Nguyễn Hà Giang - 2009 72
Mở rộng BST
 Minh họa xoay phải
22
4
45
32
25
76
50
99
60
22
4
45
32
25
76
50 99
60
Nguyễn Hà Giang - 2009 73
Mở rộng BST
 Thủ tục RotateRight xoay nút root qua phải và trả về 
địa chỉ của nút gốc mới (thay cho root).
 NodePtr RotateRight(NodePtr root)
Nếu pRoot khác rỗng & có cây con trái
p = root->left
root->left = p->right
p->right = root
return p
return NULL
Nguyễn Hà Giang - 2009 74
Mở rộng BST
 Sử dụng thủ tục RotateRight
 Xoay phải toàn cây nhị phân: trả về con trỏ là nút 
gốc mới của cây
 pTree = RotateRight(pTree)
 Xoay phải nhánh cây con bên trái của p: trả về con 
trỏ đến nút gốc mới của nhánh này
 p->left = RotateRight(p->left)
 Xoay phải nhánh cây con bên phải của p:
 P->right = RotateRight(p->right)
 Lưu ý: phải cập nhật liên kết từ nút cha đến nút 
gốc mới
Nguyễn Hà Giang - 2009 75
Nội dung
 Cấu trúc cây
 Cây nhị phân
 Cây nhị phân tìm kiếm
 Cây nhị phân tìm kiếm cân bằng AVL
Nguyễn Hà Giang - 2009 76
Đánh giá tìm kiếm
 Đánh giá việc tìm kiếm
6
3 40
36
20
24
32
Tìm giá trị 32 (T1)
24
6 36
3 20 32 40
(T2)
Nguyễn Hà Giang - 2009 77
Đánh giá tìm kiếm
 Độ phức tạp của thao tác trên BST: chiều dài 
đường dẫn từ gốc đến nút thao tác 
 Trong cây cân bằng tốt, chiều dài của đường đi 
dài nhất là logn
 1 triệu entry  đường dẫn dài nhất là log2 
1.048.576 = 20
 Trong trường hợp cây “cao”, ko cân bằng, độ 
phức tạp là O(n)
 Mỗi phần tử thêm vào theo thứ tự đã sắp
 Sự cân bằng cây là rất quan trọng
Nguyễn Hà Giang - 2009 78
Cây NP hoàn toàn cân bằng
 Cây NP hoàn toàn cân bằng
 Là cây nhị phân
 Tại mỗi nút: số nút trên nhánh trái và nhánh phải 
chênh lệch ko quá 1 nút!
P
Cây con 
bên trái
Cây con 
bên phải
nL(p): số nút cây con trái nút p
nR(p): số nút cây con phải nút p 
Nguyễn Hà Giang - 2009 79
Cây NP hoàn toàn cân bằng
 Trong cây NP hoàn toàn cân bằng
 Có 3 trường hợp có thể có của một nút (p)
 nL(p) = nR(p)
 nL(p) = nR(p)+1
 nR(p) = nL(p) +1
 Chiều dài đường đi lớn nhất trong cây NP hoàn 
toàn cân bằng với n nút là log(n)
 Quá trình thêm hay xóa một nút dễ làm mất trạng 
thái cân bằng
Nguyễn Hà Giang - 2009 80
Cây NP hoàn toàn cân bằng
 Minh họa
4
2 1
1
(T1)
5
2 2
1 1
(T2)
6
2 3
11 1
(T3)
7
3 3
1 11 1
(T4)
8
3 4
1 21 1
1 (T5)
Nhãn của nút p cho
biết số lượng nút của
cây có gốc là p
Nguyễn Hà Giang - 2009 81
Cây NP hoàn toàn cân bằng
 Cây nhị phân tìm kiếm hoàn toàn cân bằng
 Tối ưu nhất cho thao tác trên cây
 Tốc độ tìm kiếm tỉ lệ với O(logn) với n là số nút
 Thường bị mất cân bằng
 Do thêm hay xoá
 Chi phí để cân bằng rất lớn do thao tác trên toàn bộ cây
 Thực tế ít sử dụng cây NPTK hoàn toàn cân 
bằng!
 Xây dựng cây NPTK đạt trạng thái cân bằng 
yếu hơn (giảm chi phí)
Nguyễn Hà Giang - 2009 82
Cây AVL
 Cây AVL: ra đời 1962
 Do tác giả Adelson-Velskii và Landis khám phá
 Cây nhị phân cân bằng đầu tiên
 Tính chất
 Là cây nhị phân tìm kiếm
 Độ cao của cây con trái và cây con phải chênh lệch 
ko quá 1
 Các cây con cũng là AVL
Nguyễn Hà Giang - 2009 83
Cây AVL
 Mô tả
 hl(p) là chiều cao của cây con trái nút p
 hr(p) là chiều cao của cây con phải của p
 Các trường hợp có thể xảy ra trên cây AVL
 Nút p cân bằng hl(p) = hr(p)
 Lệch về trái: hl(p) > hr(p) (lệch 1 đơn vị)
 Lệch về phải: hl(p) < hr(p) (lệch 1 đơn vị)
 Thao tác thêm hay xoá có thể làm AVL mất cân 
bằng
 Thao tác cân bằng lại trên AVL xảy ra ở cục bộ
Nguyễn Hà Giang - 2009 84
Cây AVL
 Nút p cân bằng
P
TL TR
hl(P) = hr(P)
30
25
15 27
35
54
30
25
15 32
35
54
30
25
15 32
35
54
27
(T1)
(T2)
(T3)
Nguyễn Hà Giang - 2009 85
Cây AVL
 Nút p lệch trái
P
TL
TR
hl(P) = hr(P) + 1
hl(P) hr(P)
30
25
15 27
35
(T1)
30
25
15 32
35
5427
(T3)
20
30
25
15 32
35
5427
(T3)
2010
Nguyễn Hà Giang - 2009 86
Cây AVL
 Nút p lệch phải
P
TR
TL
hr(P) = hl(P) + 1
hl(P) hr(P)
30
25
32
35
54
(T1)
30
25
15 32
35
5427
(T2)
4030
25
15 32
35
54
(T3)
40 5531
Nguyễn Hà Giang - 2009 87
Cây AVL
 Chỉ số cân bằng bf (Balance Factor)
 Hiệu số chiều cao cây con trái với cây con phải
 Xét một nút p bất kỳ trong cây AVL thì bf
 bf(p) = 0: hl(p) = hr(p)
 bf(p)