− Chỉ những nút trên đường đi từ điểm chèn ngược về gốc có thể bị ảnh hưởng (chiều cao thay đổi) • Chỉ cần tái cân bằng dùng phép xoay tại nút sâu nhất. có điều kiện cân bằng bị vi phạ[r]
(1)Cây AVL
Nguyễn Mạnh Hiển
(2)Mở đầu
• Khi xây dựng nhị phân tìm kiếm, ta muốn có kiểu hơn?
• Ví dụ: dựng từ dãy {3, 5, 8, 20, 18, 13, 22}
3 18 13 20 22 13
3 8
20
(3)Mở đầu (tiếp)
• Ta muốn nhị phân tìm kiếm cân đối: − có độ sâu = log N,
− cho phép chèn xóa với thời gian chạy O(log N) trường hợp
(4)Cây AVL (Adelson-Velskii & Landis)
• Cây AVL nhị phân tìm kiếm thỏa mãn điều
kiện cân bằng:
− với nút X, chiều cao hai trái phải X sai khác không
• Quy ước rỗng có chiều cao -1
8
3
18
13 20
(5)(6)Chèn xóa AVL
• Thực chèn/xóa nhị phân tìm kiếm thơng thường
• Sau chèn/xóa, điều kiện cân bị vi phạm:
− Sửa phép xoay
(7)Ví dụ phép chèn
Chèn làm điều kiện cân bị vi phạm nút
(8)Vi phạm điều kiện cân
• Nếu điều kiện cân bị vi phạm: − Những nút cần xoay?
− Chỉ nút đường từ điểm chèn ngược gốc bị ảnh hưởng (chiều cao thay đổi) • Chỉ cần tái cân dùng phép xoay nút sâu
(9)Các trường hợp vi phạm
• Giả sử nút k nơi xảy vi phạm Có trường hợp: trái-trái: chèn vào trái trái k trái-phải: chèn vào phải trái k phải-trái: chèn vào trái phải k phải-phải: chèn vào phải phải k • Hai trường hợp (chèn ngoài) tương tự nhau:
− Phép xoay đơn để tái cân
• Hai trường hợp (chèn trong) tương tự nhau:
(10)Kiểu liệu nút
struct AvlNode { T elem;
AvlNode * left; AvlNode * right;
int height; // chiều cao nút
AvlNode(T e, AvlNode * l, AvlNode * r, int h) { elem = e;
left = l; right = r; height = h; }
};
// Hàm trả chiều cao nút int height(AvlNode * t) {