CTDL>CTDL>CTDL>CTDL>CTDL>CTDL>CTDL>CTDL>CTDL>CTDL>CTDL>CTDL>CTDL>CTDL>CTDL>CTDL>CTDL>CTDL>CTDL>CTDL>
12/13/2018 ĐẶT VẤN ĐỀ Vẽ nhị phân tìm kiếm lập 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, CÂY CÂN BẰNG – AVL Khái niệm AVL Cây AVL – Ví dụ Cây cân AVL nhị phân tìm kiếm mà đỉnh cây, độ cao trái phải chênh lệch không Do G.M Adelsen Velskii E.M Lendis đưa vào năm CÂY AVL ? 1962, đặt tên AVL Cấu trúc AVL Cấu trúc AVL Cây cân AVL nhị phân tìm kiếm bổ sung giá trị cho biết cân struct node { KDL Key; struct node *pLeft; struct node *pRight; int bal; }; typedef struct node TNode; Chỉ số cân node: hiệu số chiều cao phải trái Đối với AVL: số cân nút mang ba giá trị sau Trong bal số cân CSCB(p) =0 Nếu Độ cao phải = độ cao trái (EH) CSCB(p) =1 Nếu Độ cao phải > độ cao trái (RH) CSCB(p) =-1 Nếu Độ cao phải < độ cao trái (LH) #define EH #define RH #define LH -1 typedef TNode* AVL; 12/13/2018 Các trường trường hợp cân Các thao tác AVL Left - Left Thêm phần tử vào AVL Giống NPTK, nhiên sau thêm phải cân lại Hủy phần tử AVL Giống NPTK, nhiên sau hủy phải cân Right- Right lại Cân lại vừa bị cân (Rotation) Các trường trường hợp cân Các trường trường hợp cân Left- Right Giả sử node xảy cân phải (cây phải chênh lệch với trái 1) RR RL Right- Left Các trường trường hợp cân 10 Các trường hợp cân Mất cân phải- phải (R-R) RR T L RL L T1 L1 T T1 T2 R1 L21 R1 R21 11 12 12/13/2018 Các trường hợp cân Các trường trường hợp cân Mất cân phải- trái(R-L) Giả sử node xảy cân trái(cây trái chênh lệch với trái 1) LL LR 13 Các trường trường hợp cân 14 Các trường hợp cân Mất cân 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 cân 16 Xử lý trường hợp cân Mất cân trái- phải (L-R) Mất cân LL P Quay phải Q b P a T2 T1 T3 17 18 12/13/2018 Xử lý trường hợp cân Xử lý trường hợp cân Mất cân LL P Quay phải Mất cân LL P Quay phải 12 9 20 12 10 10 20 5 19 Xử lý trường hợp cân 20 Xử lý trường hợp cân Mất cân LL T Quay phải Mất cân LL T Quay phải 21 Xử lý trường hợp cân 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ý trường hợp cân Mất cân RR P Quay trái Mất cân RR P Quay trái 23 24 12/13/2018 Xử lý trường hợp cân Mất cân LR P Quay Trái Q Phải P Xử lý trường hợp cân P Mất cân 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ý trường hợp cân Mất cân LR P Quay Trái Q Phải P T3 Bước 1: Quay trái Q 26 h-1 Xử lý trường hợp cân Mất cân LR P b C Q C b a T1 a T2 T3 T4 T1 T2 T3 T4 Bước 2: Quay phải P 27 28 Xử lý trường hợp cân Xử lý trường hợp cân Mất cân LR 55 Quay Trái 19 Phải 55 Mất cân LR 55 Quay Trái 19 Phải 55 55 55 55 23 69 69 19 23 69 23 55 19 19 19 23 69 4 20 20 20 20 30 29 12/13/2018 Xử lý trường hợp cân Xử lý trường hợp cân Mất cân LR T Quay Trái T1 Phải T Mất cân 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 tham khảo từ • Slide tham khảo từ: • Slide CTDL GT, Khoa Khoa Học Máy Tính, ĐHCNTT • Congdongcviet.com • Cplusplus.com