39
Spring 2004Data Structure & Algorithm -Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 77
Cây nhị phân tìm kiếm cân bằng
(AVL Tree)
! Vì sao phải cân bằng ?
! Định nghĩa
! Ví dụ
! Mô tả cấu trúc dữ liệu
! Thao tác điều chỉnh cây
! Ví dụ tạo cây
! Các đánh giá
Spring 2004Data Structure & Algorithm -Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 78
AVL Tree
Vìsao phải cân bằng ?
! Cây BST có thể không cân bằng
Tom
Nancy
Alan
Bob
Ellen
Jane
Wendy
Cây bị lệch
à Chi phí O(N)
Trường hợp nào cây
BST trở nên bị lệch ?
Cần có 1 phương
pháp để duy trì độ cân
bằng cho cây !
40
Spring 2004Data Structure & Algorithm -Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 79
AVL Tree
Vìsao phải cân bằng ?
! Cây AVL là 1 dạng cây BST cân bằng
! Cấu trúc cây AVL do 3 tác giả: Adelson,
Velskii, Landis đề xuất năm 1962
! Đây là mô hình cây cân bằng động đầu tiên
được đề xuất
! Cây AVL không có độ cân bằng “tuyệt
đối”, nhưng 2 cây con không bao giờ có độ
cao chênh lệch quá 1.
Spring 2004Data Structure & Algorithm -Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 80
AVL Tree
Định nghĩa
! Cây AVL là:
! Một cây nhị phân tìm kiếm
! Mỗi nút p của cây đều thỏa: độ cao của cây
con bên trái (p->pLeft) và độ cao của cây con
bên phải (p->pRight) chênh lệch nhau không
quá 1
∀p∈T
AVL
:abs(h
p->pLeft
-h
p->pRight
)≤ 1
41
Spring 2004Data Structure & Algorithm -Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 81
AVL Tree
Vídụ
Cây AVL ?
Spring 2004Data Structure & Algorithm -Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 82
AVL Tree
Môtảcấu trúc dữ liệu
! Thêm vào mỗi nút trong cây 1 field Bal,
diễn tả trạng thái của nút đó:
! Bal = -1: nút lệch trái (cây con trái cao hơn
cây con phải)
! Bal = 0: nút cân bằng (cây con trái cao bằng
cây con phải)
! Bal = +1: nút lệch phải (cây con phải cao hơn
cây con trái)
42
Spring 2004Data Structure & Algorithm -Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 83
AVL Tree
Môtảcấu trúc dữ liệu
10
20
30
15
40
26
27
25
1
0
-1
0
1
0
0
0
Hệ số cân
bằng của
các nút
trong cây
AVL
Spring 2004Data Structure & Algorithm -Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 84
AVL Tree
Môtảcấu trúc dữ liệu
Nút gốc của
cây con trái
pRoot
Count
Nút gốc của
cây con phải
AVLT_NODE
AVL_TREE
Data Bal
pLeft pRight
Data Bal
pLeft pRight
Data Bal
pLeft pRight
43
Spring 2004Data Structure & Algorithm -Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 85
AVL Tree
Môtảcấu trúc dữ liệu
// Định nghĩa các cấu trúc dữ liệu
typedef struct tagAVLT_NODE {
intData;
intBal; // Hệ số cân bằng (-1,0,1)
tagBT_NODE*pLeft; // con trỏ đến nút con trái
tagBT_NODE*pRight; // con trỏ đến nút con phải
} AVLT_NODE;// Cấu trúc nút của cây AVL
Spring 2004Data Structure & Algorithm -Nguyen Tri Tuan - Khoa CNTT ĐH KHTN Tp.HCM 86
AVL Tree
Môtảcấu trúc dữ liệu
// Định nghĩa các cấu trúc dữ liệu … (tiếp theo)
typedef struct AVL_TREE {
intCount; // Số nút trong cây
AVLT_NODE*pRoot; // con trỏ đến nút gốc
};// Cấu trúc cây AVL