1. Trang chủ
  2. » Thể loại khác

chuong-7cay-can-bang

37 8 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Cây Cân Bằng
Định dạng
Số trang 37
Dung lượng 426 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

PowerPoint Presentation 1 3 Cây cân bằng (Balanced Tree) 3 1 Định nghĩa – Cấu trúc dữ liệu  Cây cân bằng tương đối  Là cây nhị phân thỏa mãn điều kiện là đối với mọi nút của cây thì chiều cao của câ[.]

Trang 1

3 Cây cân bằng (Balanced Tree)

3.1 Định nghĩa – Cấu trúc dữ liệu

Cây cân bằng tương đối:

 Là cây nhị phân thỏa mãn điều kiện là đối với mọi nút của

cây thì chiều cao của cây con trái và chiều cao của cây con

phải của nút đó hơn kém nhau không quá 1 (theo định

nghĩa của Adelson-Velskii và Landis)

 Cây cân bằng tương đối còn gọi là cây AVL (AVL Tree)

Cây cân bằng hoàn toàn:

 Là cây nhị phân thỏa mãn điều kiện là đối với mọi nút của

cây thì số nút của cây con trái và số nút của cây con phải của nút đó hơn kém nhau không quá 1

 Cây nhị phân cân bằng hoàn toàn là cây nhị phân cân

bằng tương đối

Trang 2

Ví dụ:

AVL Tree

AVL Tree

Trang 3

3.1 Định nghĩa – Cấu trúc dữ liệu (tt)

Để ghi nhận mức độ cân bằng tại mỗi nút gốc cây con, dùng

thêm thành phần Bal trong cấu trúc dữ liệu của mỗi nút.

typedef struct BALNode

typedef BALOneNode * BALType ;

Để quản lý cây cân bằng, chỉ cần quản lý địa chỉ nút gốc của

cây BALType BALTree;

Trang 4

3.1 Định nghĩa – Cấu trúc dữ liệu (tt)

Giá trị chỉ số cân bằng Bal tại 1 nút gốc của cây con trong cây

cân bằng tương đối bằng hiệu số giữa chiều cao cây con trái

và chiều cao cây con phải của nút đó.

Giá trị chỉ số cân bằng Bal tại 1 nút gốc của cây con trong cây

cân bằng hoàn toàn = hiệu số giữa số nút cây con trái và số nút cây con phải của nút đó.

Nếu tại mọi nút trong cây nhị phân mà thỏa mãn điều kiện

-1 <= Bal <= 1 thì cây là cây cân bằng Phạm vi từ -1 1 là phạm vi cho phép của chỉ số cân bằng Bal

 Nếu Bal = 0: cây con trái & cây con phải đều nhau

 Nếu Bal = -1: cây con trái nhỏ hơn cây con phải (lệch phải)

 Nếu Bal = +1: cây con trái nhỏ lớn cây con phải (lệch trái)

Trang 5

3.2 Các thao tác trên cây cân bằng

Các thao tác trên cây cân bằng áp dụng cho cây nhị phân tìm

kiếm cân bằng tương đối.

3.2.a Thêm 1 nút vào cây cân bằng

3.2.b Hủy một nút khỏi cây cân bằng

3.2.a Thêm 1 nút vào cây cân bằng

 Thêm một nút NewNode có thành phần dữ liệu là NewData vào trong cây

cân bằng BALTree sao cho sau khi thêm BALTree vẫn là một cây cân

bằng

 Để thực hiện điều này cần tìm kiếm vị trí của nút cần thêm là nút con trái

hoặc nút con phải của một nút PrNewNode tương tự như trong cây nhị phân tìm kiếm

 Sau khi thêm NewNode vào cây con trái hoặc cây con phải của

PrNewNode thì chỉ số cân bằng của các nút từ PrNewNode trở về các nút

Trang 6

3.2.a Thêm 1 nút vào cây cân bằng

Nếu phát hiện tại một nút AncestorNode có sự thay đổi vượt

quá phạm vi cho phép (bằng –2 hoặc +2) thì tiến hành cân

bằng lại cây ngay tại nút AncestorNode này.

Việc cân bằng lại cây tại nút AncestorNode được tiến hành cụ

thể theo các trường hợp như sau:

Trường hợp 1: Nếu AncestorNode->Bal = -2:

AncRL có chiều cao là h và AncRR có chiều cao là h+1

(AncR->Bal = -1)

AncRL và AncRR đều có chiều cao là h+1 (AncR->Bal = 0)

AncRL có chiều cao là h+1 và AncRR có chiều cao là h

(AncR->Bal = 1)

Trang 7

3.2.a Thêm 1 nút vào cây cân bằng

Nếu phát hiện tại một nút AncestorNode có sự thay đổi vượt

quá phạm vi cho phép (bằng –2 hoặc +2) thì chúng ta tiến

hành cân bằng lại cây ngay tại nút AncestorNode này.

Việc cân bằng lại cây tại nút AncestorNode được tiến hành cụ

thể theo các trường hợp như sau:

Trường hợp 1: Nếu AncestorNode->Bal = -2:

AncRL có chiều cao là h và AncRR có chiều cao là h+1

(AncR->Bal = -1)

AncRL và AncRR đều có chiều cao là h+1 (AncR->Bal = 0)

AncRL có chiều cao là h+1 và AncRR có chiều cao là h

(AncR->Bal = 1)

Trang 8

3.2.a (tt) Trường hợp 1: Nếu AncestorNode->Bal = -2: (lệch phải) Gọi: AncL = AncestorNode->BAL_Left

AncR = AncestorNode->BAL_Right

=>AncL có chiều cao là h và AncR có chiều cao là h+2 (h 0)

=>Có ít nhất 1 cây con của AncR có chiều cao là h+1

Gọi: AncRL = AncR->BAL_Left

AncRR = AncR->BAL_Right

Trang 9

3.2.a (tt) Trường hợp 1: Nếu AncestorNode->Bal = -2:

a1) AncRL có chiều cao là h và AncRR có chiều cao là h+1

(AncR->Bal = -1)

Để cân bằng lại AncestorNode, thực hiện việc

quay đơn cây con phải AncR của nút này lên thành nút gốc;

chuyển AncestorNode thành nút con trái của nút gốc và

AncestorNode có hai cây con là AncL và AncRL (BAL_Right Rotation).

Cây con AncestorNode sau khi quay cây con phải AncR sẽ là một

cây cân bằng.

Trang 10

3.2.a (tt) Trường hợp 1: Nếu AncestorNode->Bal = -2:

a1) AncRL có chiều cao là h và AncRR có chiều cao là h+1

(AncR->Bal = -1)

Trang 11

Ví dụ:

Việc thêm nút có Key = 50 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:

trở thành

nút phải của

trở thành nút gốc

Trang 12

Thực hiện quay cây con phả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:

Trang 13

3.2.a (tt) Trường hợp 1: Nếu AncestorNode->Bal = -2:

b1) AncRL và AncRR đều có chiều cao là h+1 (AncR->Bal = 0)

Trang 14

25

40

4432

5032

5035

Trang 15

3.2.a (tt) Trường hợp 1: Nếu AncestorNode->Bal = -2:

c1) AncRL có chiều cao là h+1 và AncRR có chiều cao là h

(AncR->Bal = 1)

Để cân bằng lại AncestorNode thực hiện việc quay kép: quay cây

con trái AncRL và quay cây con phải AncR (Double Rotation) Việc quay được tiến hành:

Gọi: AncRLL = AncRL->BAL_Left

AncRLR = AncRL->BAL_Right

=> AncRLL và AncRLR 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

Trang 16

3.2.a (tt) Trường hợp 1: Nếu AncestorNode->Bal = -2:

c1) AncRL có chiều cao là h+1 và AncRR có chiều cao là h

(AncR->Bal = 1)

AncRLL có chiều cao là h và AncRLR có chiều cao là h-1

(AncRL->Bal =1; h >=1)

Trang 17

Ví dụ:

Thêm nút có Key = 27 vào cây nhị phân tìm kiếm cân bằng,

thực hiện cân bằng lại như

Trang 18

Thực hiện quay đơn cây con trái của BALTree->BAL_Right cây nhị phân tìm kiếm sau khi quay trở thành cây nhị phân tìm kiếm như sau:

Trang 19

Thực hiện quay đơn cây con phả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:

Trang 20

3.2.a Thêm 1 nút vào cây cân bằng

Trường hợp 2: Nếu AncestorNode->Bal = 2:

Cũng tương tự như trường hợp 1, thực hiện quay đơn hoặc quay

kép các nhánh phía ngược lại

Gọi: AncL = AncestorNode->BAL_Left

AncR = AncestorNode->BAL_Right

=> AncL có chiều cao là h+2 và AncR có chiều cao là h (h 0)

=>Có ít nhất 1 cây con của AncL có chiều cao là h+1

Gọi: AncLL = AncL->BAL_Left

AncLR = AncL->BAL_Right

Cây con có nút gốc AncestorNode có thể ở vào một trong ba dạng sau:

AncLL có chiều cao là h+1 và AncLR có chiều cao là h (AncL->Bal

= 1)

AncLL và AncLR đều có chiều cao là h+1 (AncL->Bal = 0)

AncLL có chiều cao là h và AncLR có chiều cao là h+1 (AncL->Bal

= -1)

Trang 21

3.2.a (tt)Trường hợp 2: Nếu AncestorNode->Bal = 2(lệch trái):

a2) AncLL có chiều cao là h+1 và AncLR có chiều cao là h

(AncL->Bal = 1)

Trang 22

Minh hoạ quay đơn:

Trang 23

3.2.a ( tt)Trường hợp 2: Nếu AncestorNode->Bal = 2:

b2) AncLL và AncLR đều có chiều cao là h+1 (AncL->Bal = 0)

Trang 24

70

Trang 25

3.2.a (tt) Trường hợp 2: Nếu AncestorNode->Bal = 2:

c2) AncLL có chiều cao là h và AncLR có chiều cao là h+1

(AncL->Bal = -1)

Tương tự như T1.3), 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) Việc quay được tiến hành:

Gọi: AncLRL = AncLR->BAL_Left

AncLRR = AncLR->BAL_Right

=> AncLRL và AncLRR có chiều cao tối đa là h

Trang 26

3.2.a (tt) Trường hợp 2: Nếu AncestorNode->Bal = 2:

c2) (tt) => 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)

AncLRL có chiều cao là h và AncLRR

có chiều cao là h-1 (AncRL->Bal =1; h

>= 1)

Cả AncLRL và AncLRR đều có chiều

cao là h (AncRL->Bal =0; h >= 0)

Trang 27

3.2.a ( tt) Trường hợp 2: Nếu AncestorNode->Bal = 2:

c2) (tt) AncLRL có chiều cao là h-1 và AncLRR có chiều cao là h

(AncRL->Bal =-1; h >=1)

Trang 28

Ví dụ:

Cây nhị phân tìm kiếm cân bằng sau khi thêm nút có Key = 10 như sau:

Thực hiện quay cây con trái của BALTree

trở thành nút trái của 50

Trang 29

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:

Trang 30

3.2.a ( tt) Trường hợp 2: Nếu AncestorNode->Bal = 2:

c2) (tt) Cả AncLRL và AncLRR đều có chiều cao là h (AncRL->Bal

=0; h >= 0)

Trang 31

3.2.a ( tt) Trường hợp 2: Nếu AncestorNode->Bal = 2:

c2) (tt) AncLRL có chiều cao là h và AncLRR có chiều cao là h-1

(AncRL->Bal =1; h >= 1)

Trang 32

Ví dụ:

Cây nhị phân tìm kiếm cân bằng sau khi thêm nút có Key = 44 như sau:

Thực hiện quay cây con

phải của

BALTree->BAL_Left

Trang 33

Thực hiện quay

cây con phải của

BALTree->BAL_Left

Trang 34

34Cây tìm kiếm trở thành:

Trang 35

3.2.b Hủy một nút khỏi cây cân bằng

Tương tự như trong tháo tác thêm, hủy một nút DelNode có

thành phần dữ liệu là DelData ra khỏi cây cân bằng BALTree sao cho sau khi hủyBALTree vẫn là một cây cân bằng

Để thực hiện điều này cần tìm kiếm vị trí của nút cần hủy là

nút con trái hoặc nút con phải của một nút PrDelNode tương

tự như trong cây nhị phân tìm kiếm

Việc hủy cũng chia làm ba trường hợp như đối với trong cây

nhị phân tìm kiếm:

 DelNode là nút lá,

 DelNode là nút trung gian có 01 cây con,

 DelNode là nút có đủ 02 cây con

Trang 36

Minh hoạ quay kép:

Trang 37

3.2.b Hủy một nút khỏi cây cân bằng (tt)

Trong trường hợp DelNode có đủ 02 cây con, sử dụng

phương pháp hủy phần tử thế mạng vì theo phương pháp này

sẽ làm cho chiều cao của cây ít biến động hơn phương pháp kia.

Sau khi hủy DewNode ra khỏi cây con trái hoặc cây con phải

của PrNewNode thì chỉ số cân bằng của các nút từ

PrDelNode trở về các nút trước cũng sẽ bị thay đổi dây

chuyền và chúng ta phải lần ngược từ PrDelNode về theo các nút trước để theo dõi sự thay đổi này Nếu phát hiện tại một nút AncNode có sự thay đổi vượt quá phạm vi cho phép (bằng –2 hoặc +2) thì chúng ta tiến hành cân bằng lại cây ngay tại nút AncNode này.

Ngày đăng: 20/04/2022, 16:44

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w