12/13/2018
ĐẶT VẤN ĐỀ
Vẽ cây nhị phân tìm kiếm lập được từ dãy sau
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
Data Structures & Algorithms
theo chiều từ trái sang phải: 1, 3, 5, 6, 7, 9
1
CÂY CÂN BẰNG – AVL
3
5
6
7
9
2
Khái niệm cây AVL
Cây AVL – Ví dụ
Cây cân bằng AVL là cây nhị phân tìm kiếm mà tại
mỗi đỉnh của cây, độ cao của cây con trái và cây con
phải chênh lệch không quá 1.
Do G.M. Adelsen Velskii và E.M Lendis đưa ra vào năm
CÂY AVL ?
1962, đặt tên là AVL
3
Cấu trúc cây AVL
Cấu trúc cây AVL
Cây cân bằng AVL là cây nhị phân tìm kiếm được bổ
sung một giá trị cho biết sự cân bằng của cây.
struct node
{
KDL
Key;
struct node *pLeft;
struct node *pRight;
int bal;
};
typedef struct node TNode;
4
Chỉ số cân bằng của một node: là hiệu số của chiều
cao cây con phải và cây con trái của nó.
Đối với cây AVL: chỉ số cân bằng của mỗi nút chỉ có
thể mang một trong ba giá trị sau
Trong đó bal là chỉ số cân bằng
CSCB(p) =0 Nếu Độ cao của cây phải = độ cao cây trái (EH)
CSCB(p) =1 Nếu Độ cao của cây phải > độ cao cây trái (RH)
CSCB(p) =-1 Nếu Độ cao của cây phải < độ cao cây trái (LH)
#define EH 0
#define RH 1
#define LH -1
typedef TNode* AVL;
5
6
1
12/13/2018
Các trường trường hợp mất cân bằng
Các thao tác trên AVL
Left - Left
Thêm một phần tử vào cây AVL
Giống như cây NPTK, tuy nhiên sau khi thêm phải cân
bằng lại cây.
Hủy một phần tử trên cây AVL.
Giống như cây NPTK, tuy nhiên sau khi hủy phải cân
Right- Right
bằng lại cây.
Cân bằng lại một cây vừa bị mất cân bằng (Rotation)
7
8
Các trường trường hợp mất cân bằng
Các trường trường hợp mất cân bằng
Left- Right
Giả sử tại một node trên cây xảy ra mất cân
bằng phải (cây con phải chênh lệch với cây
con trái hơn 1)
RR
RL
Right- Left
9
Các trường trường hợp mất cân bằng
10
Các trường hợp mất cân bằng
Mất cân bằng phải- phải (R-R)
RR
T
L
RL
L
T1
L1
T
T1
T2
R1
L21
R1
R21
11
12
2
12/13/2018
Các trường hợp mất cân bằng
Các trường trường hợp mất cân bằng
Mất cân bằng phải- trái(R-L)
Giả sử tại một node trên cây xảy ra mất cân
bằng trái(cây con trái chênh lệch với cây con
trái hơn 1)
LL
LR
13
Các trường trường hợp mất cân bằng
14
Các trường hợp mất cân bằng
Mất cân bằng trái trái (L-L)
LL
LR
T
T1
L1
R
R1
T
T1
R
T2
L1
L21
R21
15
Các trường hợp mất cân bằng
16
Xử lý các trường hợp mất cân bằng
Mất cân bằng trái- phải (L-R)
Mất cân bằng LL ở P Quay phải
Q
b
P
a
T2
T1
T3
17
18
3
12/13/2018
Xử lý các trường hợp mất cân bằng
Xử lý các trường hợp mất cân bằng
Mất cân bằng LL ở P Quay phải
Mất cân bằng LL ở P Quay phải
12
9
9
7
20
12
7
10
10
20
5
5
19
Xử lý các trường hợp mất cân bằng
20
Xử lý các trường hợp mất cân bằng
Mất cân bằng LL ở T Quay phải
Mất cân bằng LL ở T Quay phải
21
Xử lý các trường hợp mất cân bằng
void rotateLL ( AVLTree &T)
{
AVLNode * T1 = T-> pLeft ;
T->pLeft = T1->pRight ;
T1-> pRight = T;
switch( T1-> balFactor )
{
case LH: T-> balFactor = EH;
T1-> balFactor = EH;
break ;
case EH: T-> balFactor = LH;
T1-> balFactor = RH;
break ;
}
T = T1;
}
22
Xử lý các trường hợp mất cân bằng
Mất cân bằng RR ở P Quay trái
Mất cân bằng RR ở P Quay trái
23
24
4
12/13/2018
Xử lý các trường hợp mất cân bằng
Mất cân bằng LR ở P Quay Trái Q Phải P
Xử lý các trường hợp mất cân bằng
P
Mất cân bằng RR ở P Quay trái
P
void rotateRR(AVLTree &T)
{
AVLNode * T1 = T-> pRight ;
T->pRight = T1-> pLeft ;
T1-> pLeft = T;
switch ( T1-> balFactor )
{
case RH: T-> balFactor = EH;
T1-> balFactor = EH;
break ;
case EH: T-> balFactor = RH;
T1-> balFactor = LH;
break ;
}
T = T1;
}
b
b
Q
Q
C
a
h
T1
T1
a
T2
h
c
T4
T4
T3
25
T2
h
Xử lý các trường hợp mất cân bằng
Mất cân bằng LR ở P Quay Trái Q Phải P
T3
Bước 1: Quay trái Q
26
h-1
Xử lý các trường hợp mất cân bằng
Mất cân bằng LR
P
b
C
Q
C
b
a
T1
a
T2
T3
T4
T1
T2
T3
T4
Bước 2: Quay phải cây P
27
28
Xử lý các trường hợp mất cân bằng
Xử lý các trường hợp mất cân bằng
Mất cân bằng LR ở 55 Quay Trái 19 Phải 55
Mất cân bằng LR ở 55 Quay Trái 19 Phải 55
55
55
55
23
69
69
19
23
69
23
55
19
19
19
23
4
69
4
4
4
20
20
20
20
30
29
5
12/13/2018
Xử lý các trường hợp mất cân bằng
Xử lý các trường hợp mất cân bằng
Mất cân bằng LR ở T Quay Trái T1 Phải T
Mất cân bằng LR ở T Quay Phải Trái
void rotateLR(AVLTree &T)
{
AVLNode * T1 = T-> pLeft ;
AVLNode * T2 = T1-> pRight ;
T-> pLeft = T2-> pRight ;
T2-> pRight = T;
T1-> pRight = T2-> pLeft ;
T2-> pLeft = T1;
switch (T2-> balFactor )
{
case LH: T-> balFactor = RH;
T1-> balFactor = EH;
break ;
case EH: T-> balFactor = EH;
T1-> balFactor = EH;
break ;
case RH: T-> balFactor = EH;
T1-> balFactor = LH;
break ;
}
T2-> balFactor = EH;
T = T2;
}
31
32
33
34
Slide được tham khảo từ
• Slide được tham khảo từ:
• Slide CTDL GT, Khoa Khoa Học Máy Tính, ĐHCNTT
• Congdongcviet.com
• Cplusplus.com
6