Tải bản đầy đủ (.pdf) (6 trang)

[11]Avl.pdf

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.26 MB, 6 trang )

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



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×