Professional Documents
Culture Documents
1
Nội dung
2
Cây nhị phân tìm kiếm cân bằng
▪Chi phí tìm kiếm, thêm mới, xoá trong cây n nút là
O(log2n)
3
Định nghĩa
▪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)
5
Trường hợp 1: Lệch trái
Quay phải
8
Ví dụ - Cân bằng cây BST
9
Lệch trái – phải: Thực hiện quay kép
10
Lệch trái – phải: Thực hiện quay kép
11
Ví dụ - Cân bằng cây BST
12
Ví dụ - Cân bằng cây BST
13
Ví dụ - Cân bằng cây BST
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
▪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
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;
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;
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
▪Sau khi hủy, nếu mất cân bằng → cân bằng lại
23
Bài tập
1. Vẽ cây BST
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