You are on page 1of 24

Bài 7: Cây nhị phân tìm kiếm

Cây cân bằng

TS. Trần Minh Thái - thaitm@huflit.edu.vn

1
Nội dung

1. Khái niệm cây AVL


2. Đặc điểm
3. Định nghĩa cấu trúc dữ liệu
4. Các kỹ thuật cân bằng cây
5. Chèn phần tử vào cây
6. Xóa phần tử khỏi cây

2
Cây nhị phân tìm kiếm cân bằng

▪Phát minh: Nhà toán học Nga G. M. Adel’Son-Vel’Skil


và E. M. Landis (1962)

▪Cấu trúc cây giúp tối ưu thời gian tìm kiếm

▪Cây nhị phân tìm kiếm cân bằng: cây AVL

▪Chi phí tìm kiếm, thêm mới, xoá trong cây n nút là
O(log2n)

3
Định nghĩa

▪Cây AVL là một cây nhị phân tìm kiếm

▪Chiều cao cây con trái và phải của nút gốc hơn kém
nhau không quá 1

▪Cả hai cây con trái và phải cũng phải là cây AVL

4
Chỉ số cân bằng (Balance factor)

Chỉ số cân bằng (bF – balance Factor) của một nút:


bF = hL – hR
✓ hL: chiều cao cây con trái
✓ hR: chiều cao cây con phải
Có 3 trường hợp:
➢bF = 0: hL = hR
➢bF > 0: hL > hR
➢bF < 0: hL < hR

5
Trường hợp 1: Lệch trái

1.1 Lệch trái – trái 1.2 Lệch trái – phải


6
Trường hợp 2: Lệch phải

2.1 Lệch phải – trái 2.2 Lệch phải – phải


7
Lệch trái - trái

Quay phải

8
Ví dụ - Cân bằng cây BST

1. Xác định node mất cân bằng


2. Cân bằng

9
Lệch trái – phải: Thực hiện quay kép

B1. Quay trái

10
Lệch trái – phải: Thực hiện quay kép

B2. Quay phải

11
Ví dụ - Cân bằng cây BST

1. Xác định node mất cân bằng


2. Cân bằng

12
Ví dụ - Cân bằng cây BST

1. Xác định node mất cân bằng


2. Cân bằng

13
Ví dụ - Cân bằng cây BST

1. Xác định node mất cân bằng


2. Cân bằng

14
Bài tập

Cho dãy số A: 45, 16, 23, 11, 30, 38, 67, 50, 20, 2, 8

→ Hãy trình bày từng bước quá trình xây dựng cây AVL
theo thứ tự từ trái sang phải cho dãy số A

15
Khai báo cấu trúc cây AVL

class CMyAVLNode<T>
{
private T data;
private int height;
private CMyAVLNode left = null;
private CMyAVLNode right = null;
//Các property get/ set
//Các phương thức
}

16
Constructor cho node

public CMyAVLIntNode(T x)
{
data = x;
height = 1;
left = null;
right = null;
}

17
Thêm 1 node vào cây AVL

▪Tương tự như trên cây NPTK

▪Sau khi thêm xong, nếu chiều cao của cây thay đổi. Nếu
có mất cân bằng → cân bằng lại ở nút này

▪Phương thức InsertNode trả về node root mới sau khi


cân bằng

18
Xác định chỉ số cân bằng

int GetBalance()
{
if (this == null)
return 0;
int hL = 0, hR = 0;
if (left != null)
hL = left.height;
if (right != null)
hR = right.height;
return hL - hR;
}

19
Phương thức xoay phải

Quay phải

CMyAVLNode<T> RightRotate()
{
CMyAVLNode<T> T1 = left;
CMyAVLNode<T> RT1 = T1.right;

T1.right = this;
left = RT1;

Height = Max(left.Height, right.Height) + 1;


T1.Height = Max(T1.left.Height, T1.right.Height) + 1;

return T1;
} 20
Phương thức xoay trái

Quay trái

CMyAVLNode<T> LeftRotate()
{
CMyAVLNode<T> T1 = right;
CMyAVLNode<T> LT1 = T1.left;

T1.left = this;
right = LT1;

Height = Max(left.Height, right.Height) + 1;


T1.Height = Max(T1.left.Height, T1.right.Height) + 1;

return T1;
} 21
public CMyAVLIntNode InsertNode(CMyAVLIntNode cur, int x){
if (data == x) return cur;
if (x < Data){
if (left == null) left = new CMyAVLIntNode(x);
else left = left.InsertNode(this, x);
}
else{ if (right == null) right = new CMyAVLIntNode(x);
else right = right.InsertNode(this, x);
}
if(cur.left!=null&&cur.right!=null)
cur.Height = 1 + Max(cur.left.Height, cur.right.Height);
else if(cur.left!=null) cur.Height = 1 + cur.left.Height;
else if(cur.right!=null) cur.Height = 1 + cur.right.Height;
int balance = cur.GetBalance();
if (balance > 1 && x < cur.left.Data) //LL
return cur.RightRotate();
if (balance < -1 && x > cur.right.Data) //RR
return cur.LeftRotate();
if (balance > 1 && x > cur.left.Data){ //LR
left = cur.left.LeftRotate();
return cur.RightRotate();
}
if (balance < -1 && x < cur.right.Data){ //RL
cur.right = cur.right.RightRotate();
return cur.LeftRotate();
}
return cur;
} 22
Hủy 1 node trên cây

▪Tương tự như trên cây NPTK

▪Sau khi hủy, nếu mất cân bằng → cân bằng lại

▪Hàm DeleteNode trả về node root sau khi cân bằng

23
Bài tập

Cho giá trị nhập từ trái sang phải như sau:

19, 27, 70, 10, 15, 21, 13, 16, 8, 9

1. Vẽ cây BST

2. Trình bày quá trình tạo cây AVL

3. Hãy trình bày từng bước quá trình xóa node gốc cây AVL

4. Trình bày thuật toán và cài đặt phương thức xóa node trên
cây AVL
24

You might also like