NULL NULL
Thực hiện quay cây con trái của BALTree, cây nhị phân tìm kiếm sau khi quay trở thành cây nhị phân tìm kiếm cân bằng như sau:
BALTree 35 0
20 1 50 0
10 0 NULL 40 0 70 0
NULL NULL NULL NULL NULL NULL
b2) AncLL và AncLR đều có chiều cao là h+1 (AncL->Bal = 0)
AncestorNode
AncL 2 AncR
AncLL 0 AncLR
h
Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật
Việc cân bằng lại AncestorNode cũng thực hiện thao tác quay đơn như trên song chỉ số cân bằng sẽ khác. Do vậy, các bước thực hiện việc quay như sau:
B1: AncestorNode->BAL_Left = AncL->BAL_Right B2: AncL->BAL_Right = AncestorNode
B3: AncL->Bal = -1
B4: AncestorNode->Bal = 1
Chuyển vai trò của AncL cho AncestorNode: B5: AncestorNode = AncL
Kết quả sau phép quay đơn cây con trái: AncL AncestorNode AncLL -1
AncLR 1 AncR
h+1 h+1 h
c2) AncLL có chiều cao là h và AncLR có chiều cao là h+1 (AncL->Bal = -1)
AncestorNode
AncL 2 AncR
AncLL -1 AncLR
h
h h+1
Cũng tương tự như trường hợp c1) Việc cân bằng lại AncestorNode được thực hiện thông qua phép quay kép: quay cây con phải AncLR và quay cây con trái AncL (Double Rotation).
Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật
Ví dụ: Việc thêm nút có Key = 44 vào cây nhị phân tìm kiếm cân bằng sau đây sẽ làm cho cây mất cân bằng và chúng ta phải cân bằng lại theo trường hợp này:
BALTree 50 1
35 0 70 0
20 0 40 0 NULL NULL
NULL NULL NULL NULL Việc quay được tiến hành cụ thể như sau:
Gọi: AncLRL = AncLR->BAL_Left AncLRR = AncLR->BAL_Right
⇒ AncLRL và AncLRR có chiều cao tối đa là h
⇒ Cây con có nút gốc AncestorNode có thể ở vào một trong ba dạng sau:
- AncLRL có chiều cao là h-1 và AncLRR có chiều cao là h (AncRL->Bal =-1; h ≥ 1) AncestorNode AncL 2 AncR AncLL -1 AncLR AncLRL -1 AncLRR h h h-1 h Quá trình quay kép được thực hiện thông các bước sau: B1: AncestorNode->BAL_Left = AncLR->BAL_Right B2: AncL->BAL_Right = AncLR->BAL_Left
B3: AncLR->BAL_Right = AncestorNode B4: AncLR->BAL_Left = AncL
Hiệu chỉnh lại các chỉ số cân bằng: B5: AncestorNode->Bal = 0
Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật B7: AncL->Bal = 1
Chuyển vai trò của AncLR cho AncestorNode và chúng ta có cây cân bằng mới: B8: AncestorNode = AncLR
AncestorNode AncLR
AncL 0
AncLL 1 AncLRL AncLRR 0 AncR
h-1
h h h
- AncLRL có chiều cao là h và AncLRR có chiều cao là h-1 (AncRL->Bal =1; h ≥ 1) AncestorNode AncL 2 AncR AncLL -1 AncLR AncLRL 1 AncLRR h h h-1 h
Quá trình quay kép được thực hiện thông các bước sau: B1: AncestorNode->BAL_Left = AncLR->BAL_Right B2: AncL->BAL_Right = AncLR->BAL_Left
B3: AncLR->BAL_Right = AncestorNode B4: AncLR->BAL_Left = AncL
Hiệu chỉnh lại các chỉ số cân bằng: B5: AncestorNode->Bal = -1
B6: AncLR->Bal = 0 B7: AncL->Bal = 0
Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật B8: AncestorNode = AncLR
AncestorNode AncLR
AncL 0
AncLL 0 AncLRL AncLRR -1 AncR
h-1
h h h
- Cả AncLRL và AncLRR đều có chiều cao là h (AncRL->Bal =0; h ≥ 0) AncestorNode AncL 2 AncR AncLL -1 AncLR AncLRL 1 AncLRR h h h h
Quá trình quay kép được thực hiện thông các bước sau: B1: AncestorNode->BAL_Left = AncLR->BAL_Right B2: AncL->BAL_Right = AncLR->BAL_Left
B3: AncLR->BAL_Right = AncestorNode B4: AncLR->BAL_Left = AncL
Hiệu chỉnh lại các chỉ số cân bằng: B5: AncestorNode->Bal = 0
B6: AncLR->Bal = 0 B7: AncL->Bal = 0
Chuyển vai trò của AncLR cho AncestorNode và chúng ta có cây cân bằng mới: B8: AncestorNode = AncLR
Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật AncestorNode AncLR
AncL 0
AncLL 0 AncLRL AncLRR 0 AncR
h h h h
Ví dụ: Thêm nút có Key = 44 vào cây nhị phân tìm kiếm cân bằng sau đây: BALTree
50 1
35 0 70 0
20 0 40 0 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
Cây nhị phân tìm kiếm cân bằng sau khi thêm nút có Key = 44 như sau: BALTree
50 2
35 -1 70 0