40 NULL NULL 10 0 NULL NULL NULL

Một phần của tài liệu Cấu trúc Cây (Trang 57 - 62)

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 (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

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

Một phần của tài liệu Cấu trúc Cây (Trang 57 - 62)