Tải bản đầy đủ (.docx) (32 trang)

Bài tập lớn Cấu trúc dữ liệu và giải thuật Cây AVL

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.11 MB, 32 trang )

HỌC VIỆN NGÂN HÀNG
KHOA HỆ THỐNG THÔNG TIN QUẢN LÝ

BÀI TẬP LỚN
CẤU TRÚC DỮ LIỆU & GIẢI THUẬT

ĐỀ TÀI: CÂY AVL – AVL TREE

Giảng viên: Giang Thị Thu Huyền

Hà nội, tháng 10 năm 2021

Nhóm thực hiện: Nhóm 6

STT Tên thành viên MSV Mức độ hoàn
thành
1 Lưu Thảo Ly 23A4040082 20.5%
23A4040080 20.25%
2 Lê Thị Hiền Lương 23A4040071 19.75%
23A4040138 20%
3 Phạm Thùy Linh 23A4040072 19.5%

4 Lê Anh Thư

5 Tô Thị Linh

NHẬN XÉT CỦA GIẢNG VIÊN

…………………………………………………………………………………………………
…………………………………………………………………………………………………
…………………………………………………………………………………………………


…………………………………………………………………………………………………
…………………………………………………………………………………………………
…………………………………………………………………………………………………
…………………………………………………………………………………………………
…………………………………………………………………………………………………
…………………………………………………………………………………………………
…………………………………………………………………………………………………
…………………………………………………………………………………………………
…………………………………………………………………………………………………
…………………………………………………………………………………………………
…………………………………………………………………………………………………
…………………………………………………………………………………………………
…………………………………………………………………………………………………
…………………………………………………………………………………………………
…………………………………………………………………………………………………
…………………………………………………………………………………………………
…………………………………………………………………………………………………
…………………………………………………………………………………………………
…………………………………………………………………………………………………
…………………………………………………………………………………………………
…………………………………………………………………………………………………
…………………………………………………………………………………………………
…………………………………………………………………………………………………
…………………………………………………………………………………………………
…………………………………………………………………………………………………
…………………………………………………………………………

LỜI CẢM ƠN

Lời đầu tiên cho phép nhóm em xin gửi lời cảm ơn chân

thành nhất đến Giảng viên Giang Thị Thu Huyền. Trong q
trình học tập một mơn rất quan trọng là Cấu trúc dữ liệu và giải
thuật, nhóm đã được cơ quan tâm và giúp đỡ tận tình. Bọn em
đã tích lũy thêm được rất nhiều kiến thức để có thể có cái nhìn
sâu sắc và hồn thiện hơn về bộ mơn này. Thơng qua bài tập
lớn lần này, nhóm muốn trình bày lại những gì mà bọn em đã
tìm hiểu trong thời gian qua.

Vì một lý do là kiến thức thì vơ hạn, nên mỗi người đều tồn
tại những hạn chế nhất định. Chính vì thế trong q trình hồn
thành bài tập lớn lần này, bọn em sẽ khơng thể tránh khỏi
những sai sót. Cả nhóm hy vọng sẽ nhận được những lời góp ý
từ cơ để bài của bọn em được hồn thiện hơn.

DANH MỤC TỪ VIẾT TẮT

CTDL> Cấu trúc dữ liệu và giải thuật
hL Chiều cao cây con trái
hR Chiều cao cây con phải
Nhị phân tìm kiếm
NPTK

DANH MỤC HÌNH ẢNH
Hình 1: Ví dụ về cây cân bằng...................................................2
Hình 2: mất cân bằng phải-phải................................................4
Hình 3:Mất cân bằng phải-trái...................................................5
Hình 4: mất cân bằng trái-trái...................................................5
Hình 5:mất cân bằng trái-phải...................................................6
Hình 6: Xử lý mất cân bằng, bằng phép quay............................7
Hình 7: Phép quay trái...............................................................7

Hình 8: Phép quay phải.............................................................8
Hình 9: Phép quay trái - phải.....................................................9
Hình 10: Phép quay phải – trái.................................................11
Hình 11: Chiều cao của cây thay đổi nhưng cây chưa mất cân
bằng........................................................................................ 12
Hình 12: Thay đổi chiều cao và làm mất độ cân bằng.............13
Hình 13: Xóa node và cân bằng lại cây....................................15
Hình 14:Tìm kiếm....................................................................16
Hình 15: Duyệt trước...............................................................17
Hình 16: duyệt giữa.................................................................18
Hình 17:duyệt sau...................................................................19

MỤC LỤC

MỞ ĐẦU..........................................................................1
NỘI DUNG.......................................................................2

I.Định nghĩa............................................................................2
1. Định nghĩa........................................................................2
2. Ví dụ về cây cân bằng......................................................2
3. Ưu nhược điểm của cây AVL.............................................3

II. Cấu trúc dữ liệu cây AVL.....................................................3
III. Cân bằng...........................................................................4

1. Các trường hợp mất cân bằng..........................................4
2. Xử lý mất cân bằng cây....................................................6
IV. Các thao tác cơ bản trên cây AVL....................................11
1. Thêm một phần tử..........................................................11
2. Xóa một phần tử.............................................................14

3.Tìm kiếm một phần tử.....................................................15
4. Các phép duyệt cây........................................................17
V. Ứng dụng.........................................................................20
VI. Độ phức tạp giải thuật.....................................................20
KẾT LUẬN.....................................................................22
TÀI LIỆU THAM KHẢO.....................................................23

MỞ ĐẦU
Định dạng của một cấu trúc cây thay đổi phụ thuộc vào
thứ tự chèn dữ liệu của nó. Trong trường hợp xấu nhất, nó có
thể có dạng đường tuyến tính (giống với danh sách liên kết), khi
đó các thao tác trên cây có hiệu quả thấp nhất. Trong các
trường hợp trung bình ta có độ phức tạp thời gian của các thao
tác chèn, xóa, và tìm kiếm phần tử trên cây là O(logn), và trong
trường hợp xấu nhất là O(n).
Năm 1962, P.M. Adelson-Velski E.M. Landis đã mở đầu
phương hướng giải quyết này bảng cách đưa ra một dạng cây
cân đối mới mà sau này được mang tên họ, đó là cây nhị phân
tìm kiếm cân bằng AVL (ta gọi là cây AVL cho gọn).
Một cây áp dụng các thuật toán giúp định dạng của cây
được cân bằng. Được gọi là cây cân bằng. Ta sẽ đi vào tìm hiểu
kỹ hơn về cây cân bằng và các thuật toán giúp cây cân bằng
ngay dưới đây.

1

NỘI DUNG

I.Định nghĩa


1. Định nghĩa
Cây AVL là cây nhị phân tìm kiếm mà sự khác biệt về

chiều cao giữa cây con trái và cây con bên phải không vượt quá
1. Các thao tác cơ bản với cây AVL là thêm node hoặc xóa node
khỏi cây cũng giống với cây nhị phân tìm kiếm, chỉ có sự khác
biệt là ta cần duy trì sự cân bằng của cây (sự khác biệt về chiều
cao giữa cây con bên trái và cây con bên phải của các node
khơng được vượt q 1).
2. Ví dụ về cây cân bằng

Dưới đây là hình ví dụ minh họa ba cây, trong đó cây đầu
tiên là cân bằng, cây thứ hai và thứ ba là không cân bằng.

Hình 1: Ví dụ về cây cân bằng
Trong cây thứ hai, cây con bên trái của C có độ cao là 2 và
cây con bên phải có độ cao là 0, do đó hiệu số là 2. Trong cây
thứ ba, cây con bên phải của A có độ cao là 2 và cây con bên
trái có độ cao là 0, do đó hiệu số cũng là 2. Trong khi cây AVL
chỉ chấp nhận hiệu số (hay Nhân tố cân bằng) là 1.

2

Nếu hiệu số giữa độ cao của các cây con bên trái và cây
con bên phải là lớn hơn 1 thì cây được cân bằng bởi sử dụng
một số kỹ thuật quay AVL được trình bày dưới đây.

Để làm cho cây tự cân bằng, một cây AVL có thể thực hiện
4 loại kỹ thuật quay sau:


+ Kỹ thuật quay trái
+ Kỹ thuật quay phải
+ Kỹ thuật quay trái-phải
+ Kỹ thuật quay phải-trái
Hai kỹ thuật quay đầu tiên là các kỹ thuật quay đơn và hai
kỹ thuật quay còn lại là các kỹ thuật quay ghép.
3. Ưu nhược điểm của cây AVL
a. Ưu điểm: Hiệu năng tìm kiếm ln được đảm bảo kể cả trong
trường hợp xấu nhất (bằng O(logN)).
b. Nhược điểm: Khi chèn phần tử hoặc xoá phần tử khỏi cây thì
cần thêm một thao tác đó là giữ cho cây cân bằng.

II. Cấu trúc dữ liệu cây AVL

Chỉ số cân bằng là độ lệch giữa chiều cao cây trái và chiều
cao cây phải của một nút:
Các giá trị hợp lệ :

+ CSCB(p) = 0 - Độ cao cây trái (p) = Độ cao cây
phải (p)

+ CSCB(p) = 1 - Độ cao cây trái (p) < Độ cao cây
phải (p)

3

+ CSCB(p) = -1 - Độ cao cây trái (p) > Độ cao cây
phải (p)

Để dễ trình bày, các giá trị trên được định nghĩa dưới dạng như

sau:

+ #define LH -1 //cây con trái cao hơn

+ #define EH 0 //cây con trái bằng cây con phải

+ #define RH 1 //cây con phải cao hơn

typedef struct tagAVLNode
{ char balFactor; //chỉ số cân bằng
Data key;
struct tagAVLNode* pLeft;
struct tagAVLNode* pRight;
}AVLNode;
typedef AVLNode *AVLTree;

III. Cân bằng

1. Các trường hợp mất cân bằng

TH1: Mất cân bằng phải phải (R-R)

4

+ Tại nút 18: Hình 2: mất cân bằng phải-phải
hL=0, hR=2

=>Lệch phải

+ Tại nút 22: hL=0, hR=1


=>Lệch phải

=> Tại nút 18 cây lệch phải phải

TH2: Mất cân bằng phải trái (R-L)

+ Tại nút 18: Hình 3:Mất cân bằng phải-trái
hL=0, hR=2
=>lệch phải

5

+ Tại nút 22: hL=1, hR=0
=> lệch trái

=>Tại nút 18 cây lệch phải trái
TH3: Mất cân bằng trái trái(L-L)

+ Tại nút 8: Hình 4: mất cân bằng trái-trái
hL=2, hR=0

=>Lệch trái

+ Tại nút 5: hL=1, hR=0

=>lệch trái

=> tại nút 8 cây lệch trái trái


TH4: mất cân bằng trái phải(L-R)

6

+ Tại nút 8: Hình 5:mất cân bằng trái-phải
hL=2, hR=0

=>Lệch trái

+ Tại nút 5: hL=0, hR=1

=>lệch phải

=> tại nút 8 cây lệch trái phải

2. Xử lý mất cân bằng cây

Biến 1 cây nhị phân tìm kiếm thành cây cân bằng AVL tại
vị trí bị mất cân bằng bằng cách xử dụng phép quay cây.

Xử lý cụ thể cho các trường hợp mất cân bằng như sau:

Hình 6: Xử lý mất cân bằng, bằng phép quay

7

a. Xoay trái
Trong trường hợp cây ở trạng thái không cân bằng khi một

node được chèn vào làm con phải của một cây có một node gốc

và một node con phải. Lúc này ta phải thực hiện phép quay trái
để đưa cây trở lại trạng thái cân bằng.

Hình 7: Phép quay trái
Ở ví dụ trên, node A trở thành node khơng cân bằng khi có
một node chèn vào cây con bên phải của nó. Chúng ta thực
hiện phép quay trái bởi đưa node A trở thành con trái của node
B, để đưa cây về trạng thái cân bằng.
b. Xoay phải
Trong trường hợp cây ở trạng thái không cân bằng khi một
node được chèn vào làm con trái của một cây có một node gốc
và một node con trái. Lúc này ta phải thực hiện phép quay phải
để đưa cây trở lại trạng thái cân bằng.

8

Hình 8: Phép quay phải
Ở ví dụ trên, khi thực hiện phép quay phải ta đưa node A
(node mất cân bằng) trở thành con phải của node B.
c. Phép quay trái - phải
Phép quay kết hợp có đơi chút phức tạp hơn so với các
phép quay trái và quay phải ở trên. Với phép quay trái-phải, ta
sẽ thực hiện việc quay trái trước và quay phải sau đó.

Khi một node được chèn vào
làm con phải của cây con trái.
Điều này làm cho node C bị
mất cân bằng. Trong tình
huống như vậy ta phải thực
hiện phép quay kết hợp trái -

phải, để đưa cây trở về trạng
thái cân bằng.
Đầu tiên, trên cây con trái của
node C, ta sẽ thực hiện phép
quay trái để khiến A trở thành
con trái của B.

9

Sau khi thực hiện xong một
phép quay trái, cây vẫn chưa
ở trạng thái cân bằng. Để đưa
cây trở về trạng thái cân
bằng, ta cần tiếp tục thực
hiện một phép quay phải.
Phép quay phải sẽ đưa B trở
thành node gôc mới. Node C
trở thành con phải của B.

Sau phép quay kết hợp, cây
đã có trạng thái cân bằng.

Hình 9: Phép quay trái - phải
d. Phép quay phải-trái

Phép quay này là kết hợp của phép quay phải và theo sau
bởi một phép quay trái.

10


Khi một node được chèn vào
làm con trái của cây con phải.
Điều này làm cho node A bị
mất cân bằng. Trong tình
huống như vậy ta phải thực
hiện phép quay kết hợp phải -
trái, để đưa cây trở về trạng
thái cân bằng.
Đầu tiên, trên cây con phải
của node A, ta sẽ thực hiện
phép quay phải để khiến C trở
thành con phải của B.

Sau khi thực hiện xong một
phép quay phải, cây vẫn chưa
ở trạng thái cân bằng. Để đưa
cây trở về trạng thái cân
bằng, ta cần tiếp tục thực
hiện một phép quay trái.

Phép quay trái tiếp theo sẽ
đưa B trở thành node gôc mới.
Node A trở thành con trái của
B.

11

Sau phép quay kết hợp, cây
đã có trạng thái cân bằng.


Hình 10: Phép quay phải – trái

IV. Các thao tác cơ bản trên cây AVL
1. Thêm một phần tử
+ Thêm bình thường như trường hợp cây NPTK
+ Nếu cây tăng trưởng chiều cao

Lần ngược về gốc để phát hiện nút bị mất cân bằng
Tiến hành cân bằng lại nút đó bằng thao tác cân bằng
thích hợp
+ Việc cân bằng lại chỉ cần thực hiện 1 lần nơi mất cân bằng
*Việc thêm một phần tử vào cây AVL giống như khi thêm một
phần tử vào cây NPTK và phải tuân thủ những quy tắc của cây
NPTK.
+ Giá trị của tất cả các Node ở cây con bên trái phải <= giá trị
của Node gốc.
+ Giá trị của tất cả các Node ở cây con bên phải phải > giá trị
của Node gốc.
+ Tất cả các cây con (bao gồm bên trái và phải) cũng đều phải
đảm bảo 2 tính chất trên.

12

Mỗi nút đưa thêm 1 thông tin là hệ số cân bằng có thể nhận 3
giá trị:

+ Left_higher (hoặc ‐1)
+ Equal_height (hoặc 0)
+ Right_higher (hoặc +1)
Nếu chiều cao của cây thay đổi sau khi thêm xong một phần

tử , ta phải xét từ dưới gốc lên khi đó ta sẽ có hai trường hợp
+ TH1: Chiều cao của cây thay đổi nhưng cây chưa mất
cân bằng
Nếu node có giá trị 3 được thêm vào, sẽ có một node có
hệ số cân bằng bằng 1 xuất hiện, nhưng ta chưa cần phải điều
chỉnh vì hệ số cân bằng chưa vượt quá 1.

Hình 11: Chiều cao của cây thay đổi nhưng cây chưa mất cân
bằng

+ TH2: Thay đổi chiều cao và làm mất độ cân bằng
Khi node có giá trị bằng 2 được thêm vào sẽ dẫn đến trong
cây xuất hiện một node có hệ số cân bằng bằng 2. Lúc này ta
cần điều chỉnh để đưa cây về trạng thái cân bằng.

13

Hình 12: Thay đổi chiều cao và làm mất độ cân bằng
Chú ý: ta chỉ thực hiện phép xoay tại nút mất cân bằng
CODE: void insert_node(tree_avl &root, int x)

{ int bal;
if(root==NULL)
root=getnode(x);
else
{ if(x< root->data)
insert_node(root->left,x);
else
insert_node(root->right,x);
root->height=max(height(root-


>left),height(root->right))+1;
bal=getbalance(root);
if(bal>1 && x < root->left->data)
right_rotate(root);
else if(bal<-1 && x > root->right->data)

14


×