Các thuật toán cơ bản trên cây đỏ đen

Một phần của tài liệu Xây dựng chương trình mô phỏng các thuật toán cơ bản trên cây đỏ đen (Trang 33)

2.5.1. Thêm một nút mới

2.5.1.1. Các phép lật trên đường đi xuống

Phép thêm vào trong cây đỏ đen bắt đầu như trên cây tìm kiếm nhị phân thông thường: Đi theo một đường dẫn từ nút gốc đến vị trí cần chèn, đi qua phải hay trái tùy vào giá trị của khóa nút và khóa tìm kiếm.

Tuy nhiên, trong cây đỏ đen, để đến được điểm chèn là phức tạp bởi các phép lật màu và quay.

Để đảm bảo không vi phạm các tính chất, cần phải tiến hành phép lật màu khi cần theo quy tắc sau:

26

Nếu phép thêm vào làm xuất hiện tình trạng một nút đen có hai nút con đỏ, phải đổi các nút con thành đen và nút cha thành đỏ (trừ khi nút cha là nút gốc, nó vẫn giữ nguyên màu đen).

Một phép lật màu ảnh hưởng đến các tính chất đỏ đen ra sao? Gọi nút ở đỉnh tam giác, nút có màu đen trước phép lật màu P (P thay cho nút cha). Gọi hai nút con trái và phải của P là x1 và x2. Xem hình 2.3.a

Hình 20.3. Lật màu

Nhận thấy sau khi lật màu chiều cao đen của cây không đổi, như vậy phép lật màu không vi phạm tính chất 4.

Mặc dù tính chất 4 không bị vi phạm qua phép lật, nhưng tính chất 3 (một nút con và nút cha không thể đồng thời màu đỏ) lại có khả năng bị vi phạm. Nếu nút cha của P là đen, không có vấn đề vi phạm khi P được đổi từ đỏ sang đen, nhưng nếu nút cha của P là đỏ, sau khi đổi màu thì sẽ có hai nút đỏ trên một hàng.

Điều này cần phải được chuẩn bị trước khi đi xuống theo cây để chèn nút mới. Có thể giải quyết trường hợp này bằng phép quay.

Đối với nút gốc thì phép lật màu nút gốc và hai nút con của nó vẫn làm cho nút gốc cũng như hai nút con có màu đen. Điều này tránh sự vi phạm tính chất 2 và tính chất 4 (xung đột đỏ - đỏ). Trong trường hợp này, chiều cao đen

a) X1, X2 đỏ b) X1, X2 đổi sang đen

P

X1 X2

P

27

trên mỗi đường đi từ nút gốc tăng lên 1, do đó tính chất 4 cũng không vi phạm.

2.5.1.2. Các phép quay nút

Thao tác chèn nút mới có thể làm cho quy tắc đỏ - đen bị vi phạm. Do vậy sau khi chèn, cần phải kiểm tra xem có phạm quy tắc không và có thực hiện những thao tác hợp lý.

Như đã xét ở trên, nút mới được chèn mà gọi là nút x, luôn luôn đỏ. Nút x có thể nằm ở những vị trí khác nhau đối với P và G, như trong hình 2.4.

Hình 21.4. Các biến dạng của nút khi được chèn với x là cháu ngoại

Hình 22.5. Các biến dạng của nút khi được chèn với x là cháu nội.

G P X 1 G P X G P X G P X 1

28

X là một nút cháu ngoại nếu nó nằm cùng bên nút cha P và P cùng bên nút cha G. Điều này có nghĩa là, x là nút cháu ngoại nếu hoặc nó là nút con trái của P và P là nút con trái của G, hoặc nó là nút con phải của P, và P là nút con phải của G. Ngược lại, x là một nút cháu nội.

Nếu x là nút cháu ngoại, nó có thể hoặc bên trái hoặc bên phải của P, tùy vào việc nút P ở bên trái hay bên phải của G. Có hai khả năng tương tự nếu x là một nút cháu nội. Bốn trường hợp này trình bày trong hình 2.4, hình 2.5.

Thao tác phục hồi quy tắc đỏ - đen được xác định bởi các màu và cấu hình của nút x và những bà con của nó. Có các khả năng xảy ra được xem xét như sau: (Hình 2.6.)

a) P đen b) P đỏ, X là cháu ngoại

c) P đỏ, X là cháu nội Hình 23.6. Các khả năng khi chèn nút G x P G x P G x P (adsbygoogle = window.adsbygoogle || []).push({});

29

Xét các khả năng trên một cách cụ thể như sau: a) Khả năng 1: P đen

P đen là trường hợp đơn giản. Nút thêm vào luôn đỏ. Nếu nút cha đen, không xung khắc đỏ - đỏ (tính chất 3), và không có cộng thêm vào số nút đen (tính chất 4). Do vậy, không bị vi phạm quy tắc về màu. Thao tác chèn đã hoàn toàn.

b) Khả năng 2: P đỏ và x là cháu ngoại của G

Nếu nút P đỏ và x là nút cháu ngoại, cho nên cần một phép quay đơn giản và một vài thay đổi về màu. Bắt đầu với giá trị tại nút gốc, và chèn các nút 25, 75 và 12. Cần phải làm một phép lật mày trước khi chèn nút 12.

Bây giờ, chèn nút mới x là 6 (hình 2.5.a) xuất hiện lỗi: Cha và con đều đỏ, vì vậy cần phải có thao tác như sau:

Trong trường hợp này, có thể áp dụng ba bước để phục hồi tính đỏ - đen và làm cho cân bằng cây. Sau đây là các bước:

+ Đổi màu nút G – nút ông bà của nút x (trong ví dụ này là nút 25). + Đổi màu nút P – nút cha của nút x (nút 12).

+ Quay với nút G (nút 25) ở vị trí đỉnh, theo hướng làm nâng nút x lên (nút 6). Đây là một phép quay phải.

Khi hoàn thành ba bước trên sẽ được một cây đỏ đen cân bằng (hình 2.7.b)

30

a) Đổi màu và quay

b) Tái cân bằng cây

Hình 24.7. Nút P đỏ và X là cháu ngoại c) Khả năng 3: P đỏ và X là cháu nội của G

Nếu nút P đỏ và x là cháu nội của G, cần thực hiện phép quay và một vài phép đổi màu. Cây đỏ đen được tạo thành từ các nút 50, 25, 75, 12 và 18 (cần phải lật màu trước khi chèn nút 12) xem hình 2.8a.

Nút 18 là nút cháu nội. Nút này và nút cha đều đỏ (cha và con đều đỏ). Chỉnh lại sự sắp xếp này cũng khá rắc rối hơn. Nếu cố quay phải nút ông bà G (nút 25) ở đỉnh, như đã làm trong khả năng 2, nút cháu trong x (nút 18) đi ngang hơn là đi lên, như thế cây không cân bằng như trước (thử làm

Đổi màu Quay Đổi màu 12 6 50 75 25 75 6 25 50 12

31

điều này, rồi quay trở lại với nút 12 ở đỉnh, để phục hồi cây như cũ). Phải cần một cách khác.

Phương pháp cần dùng khi x là nút cháu nội là tiến hành hai phép quay hơn là một phép. Phép quay đầu biến x từ một nút cháu nội thành nút cháu ngoại, như hình 2.8b. Bây giờ, trường hợp là tương tự như khả năng 1, và có thể áp dụng cùng một phép quay, với nút ông bà ở đỉnh, như đã làm trước đây. Kết quả như hình 2.8c.

Cũng cần tô màu lại các nút trước khi thực hiện bất cứ phép quay nào (thứ tự không quan trọng, nhưng nếu đợi đến khi quay mới tô màu lại các nút thì khó mà biết phải gọi chúng như thế nào) các bước là:

+ Đổi màu nút ông bà của nút x (nút 25). + Đổi màu nút x (nút 18)

+ Quay trái nút P - nút cha của nút x - ở đỉnh (nút cha đây là nút 12).

32

a)Đổi màu và quay

b) Quay

c) Tái cân bằng cây

Hình 25.8. P đỏ và x là nút cháu nội 50 25 75 18 12 G P X Quay Đổi màu Đổi màu 50 18 75 25 12 50 18 75 25 12 2

33 2.5.2. Xóa một nút

Trong cây tìm kiếm nhị phân bình thường khi xóa một nút có cả hai con (không là lá NULL), tìm phần tử lớn nhất trong cây con trái hoặc phần tử nhỏ nhất trong cây con phải, chuyển giá trị của nó vào nút đang muốn xóa. Khi đó xóa đi nút đã được copy giá trị, nút này có ít hơn hai con (không là lá NULL). Vì việc copy giá trị không làm mất tính chất đỏ đen nên không cần phải sửa chữa gì cho thao tác này. Việc này chỉ đặt ra khi xóa các nút có nhiều nhất một con (không là lá NULL). Về việc xóa một nút có nhiều nhất một con (không là lá NULL). Nếu xóa một nút đỏ, có thể chắc chắn rằng con của nó là nút đen. Tất cả các đường đi đi qua nút bị xóa chỉ đơn giản bớt đi một nút đỏ do đó tính chất 5 không thay đổi. Ngoài ra, cả nút cha và nút con của nút bị xóa đều là nút đen, do đó tính chất 3 và tính chất 4 vẫn giữ nguyên. Một trường hợp đơn giản khác là khi xóa một nút đen chỉ có một con là nút đỏ. Khi xóa nút đó các tính chất 4 và tính chất 5 bị phá vỡ, nhưng nếu gán lại màu cho nút con là đen thì chúng lại được khôi phục. (adsbygoogle = window.adsbygoogle || []).push({});

Trường hợp phức tạp xảy ra khi cả nút bị xóa và nút con của nó đều đen. Sẽ bắt đầu bằng việc thay nút bị xóa bằng nút con của nó. Nút con này được gọi là S (trong vị trí mới của nó là N, và anh em với nó, con khác của nút cha mới). Tiếp theo vẫn dùng P chỉ cha mới của N, chỉ con trái của S và

chỉ con phải của S (nó tồn tại vì S không thể là lá).

Giữa các trường hợp khác nhau, vai trò và nhãn của các nút có thể thay đổi. Trong hình vẽ các màu đỏ đen được thể hiện khi màu của nút đã rõ ràng, các đường thẳng gạch biểu thị các nút chưa rõ màu (hoặc đỏ hoặc đen). Vì thế, cần hoàn chỉnh các lá NULL sau mọi phép thay đổi. Nếu nút bị xóa không có con N khác “lá NULL”, dễ dàng thấy rằng các tính chất được thỏa mãn. Còn nếu N là một “lá NULL”, có thể sửa chữa lược đồ để trong tất cả các trường hợp các tính chất thỏa mãn.

34

Nếu tất cả N và gốc ban đầu của nó là đen thì sau khi xóa các đường qua “N” giảm bớt một nút đen. Do đó vi phạm tính chất 5, cây cần phải cân bằng lại.

Có các trường hợp sau:

Trường hợp 1: N là gốc mới. Trong trường hợp này dừng lại và đã giải phóng một nút đen khỏi mọi đường đi và gốc mới lại là đen. Không tính chất nào bị vi phạm.

Như vậy, trong các trường hợp 2, 5 và 6 quy ước N là con trái của P. Nếu nó là con phải thì left và right sẽ trao đổi cho nhau.

Trường hợp 2: S là đỏ. Trong trường hợp này tráo đổi màu của P và S, sau đó quay trái tại P, nó sẽ làm cho S trở thành nút ông của N. P có màu đen và có một con màu đỏ. Tất cả các đường đi có số các nút đen giống nhau, bây giờ N có một anh em màu đen và cha màu đỏ, có thể tiếp tục với các trường hợp 4, 5 và 6 (anh em mới của nó là đen và chỉ có một con của nút đỏ là S). Trong trường hợp sau anh em mới của N được gọi là S.

Hình 26.9. Minh họa trường hợp 2

Trường hợp 3: P, S và các con của S là đen. Trong trường hợp này, gán lại màu đỏ. Kết quả là mọi đường đi qua S (tất nhiên không qua N, có ít hơn một nút đen). Vì việc xóa đi cha trước đây của N làm tất cả các đường đi qua N bớt đi một nút đen, nên bằng nhau. Tuy nhiên, tất cả các đường đi qua P

P S S S N S S P N S

35

bầy giờ có ít hơn một nút đen so với các đường không qua P, do đó tính chất 5 (tất cả các đường đi từ gốc tới các nút lá có cùng số nút đen) sẽ bị vi phạm. Để sửa chữa nó thì phải tái cân bằng P, bắt đầu từ trường hợp 1.

Hình 27.10 Minh họa trường hợp 3

Trường hợp 4: S và các con của S là đen nhưng P là đỏ. Trong trường hợp này, phải đổi ngược màu của S và P. Điều này không ảnh hưởng tới số nút đen trên các đường đi thông qua N, nhưng thêm một nút đen trên các đường đi qua N, thay cho nút đã bị xóa trên các đường này,

Hình 28.11. Minh họa trường hợp 4

Trường hợp 5: S là đen, con trái của S là đỏ, con phải của S là đen, còn N là con trái của cha nó. Trong trường hợp này thì phải quay phải tại S, khi đó

P S N S S P S N S P S N S p N S

36

con trái của S trở thành cha của S và N là anh em mới của nó. Sau đó, thì phải tráo đổi màu của S và cha mới của nó. Tất cả các đường đi sẽ có số nút đen như nhau, nhưng bây giờ N có một người anh em bên phải của nó lại là đỏ

Hình 29.12. Minh họa trường hợp 5

Trường hợp 6: S là đen, con phải của S là đỏ và N là con trái của nút cha P. Trong trường hợp này thì phải quay trái tại P, khi đó S trở thành cha của P và con phải của S. Phải hoán đổi màu của P và S, gán cho con phải của S màu đen. Cây con giữ nguyên màu của gốc do đó tính chất 4 (cả hai con của nút đỏ là đen) và tính chất 5 không bị vi phạm trong cây con này. Tuy nhiên, N bây giờ có thêm một nút đen tiền nhiệm: Hoặc P mới bị tô đen, nó đã là đen sẵn và S là nút ông của nó trở thành đen. Như vậy các đường đi qua N có thêm một nút đen.

Trong lúc này, với một đường đi không qua N có hai khả năng:

+ Đi qua nút anh em của N. Khi đó cả trước và sau khi quay nó phải đi qua S và P, khi thay đổi màu sắc hai nút này đã tráo đổi màu cho nhau. Như vậy, đường đi này không bị thay đổi số nút đen.

+ Đi qua nút bác của N, là con phải của S. Khi đó, trước khi quay nó đi qua S, cháu của S, và con phải của S, nhưng sau khi quay nó chỉ đi qua nút S và con phải của S, khi này S đã nhận màu cũ của cha P còn con phải của S đã đổi màu từ đỏ thành đen. Kết quả là số nút

S

S S S

37

đen trên đường đi này không thay đổi. Do đó các tính chất 4 và 5 đã được khôi phục. Đường kẻ gạch trong hình vẽ có thể là nối tiếp là nút đỏ hoặc nút đen, nhưng phải ghi lại trước và sau khi thay đổi. (adsbygoogle = window.adsbygoogle || []).push({});

Hình 30.13. Minh họa trường hợp 6 2.5.3. Tìm kiếm một nút

Khi đã xây dựng được cấu trúc cây đỏ đen thì thao tác tìm kiếm cấu trúc dữ liệu này sẽ được thực hiện như trong cây nhị phân tìm kiếm.

Khi tìm kiếm một khoá x nào đó có ở trên cây đó hay không, đầu tiên phải so sánh x với khóa ở gốc và có 1 trong 4 trường hợp sau đây sẽ xuất hiện:

+ Không có gốc (cây rỗng), x không có trên cây: Phép tìm kiếm không thỏa.

+ X trùng với khóa gốc: Phép tìm kiếm được thỏa.

+ X nhỏ hơn khóa gốc: Tìm kiếm thực hiện tiếp tục bằng cách xét cây con trái của gốc với cách làm tương tự.

+ X lớn hơn khóa gốc: Tìm kiếm thực hiện tiếp tục bằng các xét cây con bên phải của gốc với cách làm tương tự.

P S N S S P N S S S

38

CHƯƠNG 3.

XÂY DỰNG CHƯƠNG TRÌNH MÔ PHỎNG

3.1. Phát biểu bài toán

Tìm kiếm là một đòi hỏi rất thường xuyên và làm thế nào để tìm kiếm được nhanh nhất luôn được đề cao trong đời sống hàng ngày cũng như trong xử lý tin học. Vấn đề tìm kiếm nói một cách tổng quát chính là tìm một đối tượng nào đó, thỏa mãn một số yêu cầu đã được biết trước trong tập lớn các đối tượng xác định. Có nhiều phương pháp tìm kiếm cơ bản và phổ biến. Đối với tìm kiếm bên trong (dữ liệu ở bộ nhớ trong), tìm kiếm nhị phân lại là một phương pháp khá thông dụng và phổ biến, chi phí ít và đạt kết quả tốt. Tuy nhiên, khi sử dụng tìm kiếm nhị phân, dãy khóa đã phải sắp xếp rồi, nghĩa là thời gian sắp xếp cũng phải kể đến. Nếu dãy khóa biến động chị phí nổi lên rất rõ và chính điều ấy bộc lộ nhược điểm của phương pháp này.

Để khắc phục nhược điểm vừa nêu trên đối với tìm kiếm nhị phân và đáp ứng yêu cầu tìm kiếm đối với một bảng biến động, một phương pháp mới

Một phần của tài liệu Xây dựng chương trình mô phỏng các thuật toán cơ bản trên cây đỏ đen (Trang 33)