1. Trang chủ
  2. » Luận Văn - Báo Cáo

Xây dựng cấu trúc cây đỏ đen

39 419 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

Định dạng
Số trang 39
Dung lượng 434,5 KB

Nội dung

kn là một cây nhị phân mà mà mỗi nút của nó đều đợc định danh bởi mọt khoá nào đó trong các khoá đã cho và đối với mọi nút trên cây tính chất sau đây luôn luôn đợc thoả mãn.. Giải thuật

Trang 1

Lời nói đầu……… 3

Chơng I : Giới thiệu về ngôn ngữ Visual C++ và th viện lập trình MFC 5

I Các công cụ hỗ trợ lập trình 5

1 Visual Assist 5

2 MSDN (Microsoft Developer Network) 5

II MÔI TRƯờNG LậP TRìNH 6

1 Tạo project sử dụng th viện MFC .6

1.1 Vùng 1 – Workspace 6

1.2 Vùng 2 6

1.3 Vùng 3 - Output 6

2 Các control chuẩn 6

2.1 Hộp Control 6

2.2 Các control chuẩn 7

2.3 Thiết lập thuộc tính cho control 7

2.4 Control Thuộc tính mặc định 7

2.5 Sự kiện và xử lý sự kiện 8

a Sự kiện 8

b Tạo hàm xử lý sự kiện 8

2.6 Debug chơng trình 8

Chơng II: Khái quát cây đỏ đen, các thuật toán cơ bản và những nhận xét về cấu trúc cây đỏ đen 10

I Khái quát cây đỏ đen 10

Trang 2

1 Giới thiệu cây nhị phân tìm kiếm (binary search tree) 10

2 Giải thuật tìm kiếm 10

3 Loại bỏ trên cây tìm kiếm nhị phân 12

4 Cây đỏ đen 14

4.1 Quy tắc đỏ đen 16

II Các thuật toán cơ bản của cây đỏ đen 17

1 Thêm một nút mới 17

1.1 Các phép lật màu trên đờng đi xuống 17

1.2 Các phép quay khi chèn nút 18

2 Xóa một nút 25

III Các giao diện chơng trình 26

1 Giao diện chính của chơng trình 26

2 Giao diện chèn nút vào cây 27

a Giao diện nhập giá trị cần chèn 27

b Giao diện chèn nút thành công 28

c Giao diện chèn trùng nút đã có trên câ.y 39

d Giao diện chèn nút không thành công 30

3 Giao diện xoá nút ra khỏi cây 31

a Giao diện nhập giá trị nút cần xoá 31

b Giao diện xoá nút không thành công 32

c Giao diện xoá nút không thành công 33

4 Giao diện tìm kiếm nút trên cây 34

a Giao diện nhập giá trị cần tìm kiếm 34

b Giao diện tìm kiếm thành công 35

c Giao diện không tìm thấy nút trên cây 36

Kết luận 37

Tài liệu tham khảo 38

Trang 3

lời nói đầu

Ngày nay công nghệ thông tin đang đóng vai trò quan trọng trong nhiều lĩnh vực đời sống kinh tế, xã hội của nhiều quốc gia trên thế giới, là một phần không thể thiếu trong xã hội ngày càng hiện đại hóa

Sự phát triển nhảy vọt của công nghệ thông tin đã làm ảnh hởng đến hoạt

động đời sống xã hội, làm thay đổi phong cách làm việc của một xã hội Công nghệ thông tin đã trở thành trụ cột chính của nền tri thức nhân loại, phạm vi ứng dụng của công nghệ thông tin ngày càng mở rộng trên nhiều lĩnh vực: lu trữ và xử lý số liệu, truyền thông, giải trí…

Nói đến công nghệ thông tin chúng ta không thể không nhắc đến các ngôn ngữ lập trình, các ngôn ngữ lập trình đóng vai trò hết sức quan trọng trong lĩnh vực công nghệ thông tin Công nghệ thông tin phát triển dẫn đến sự

ra đời của nhiều ngôn ngữ lập trình mới thân thiện hơn với ngời sử dụng nh: Visual C++, Visual Basic, Java, C#

Cây đỏ đen là một trong những cấu trúc dữ liệu hay, cùng với cây nhị phân tìm kiếm là những cấu trúc dữ liệu có điểm mạnh trong việc lu trữ và tìm kiếm dữ liệu Song cây đỏ đen có những đặc tính riêng mà nhờ đó nó đã làm nổi bật những điểm mạnh của mình Chính vì vậy, tôi đã nghiên cứu ngôn ngữ lập trình là ngôn ngữ Visual C++ và chọn đề tài Xây dựng cấu trúc cây đỏ đen

làm đồ án tốt nghiệp đại học

Đề tài Xây dựng cấu trúc cây đỏ đen ngoài phần mở đầu và kết luận gồm

2 chơng:

Chơng I: Giới thiệu ngôn ngữ Visual C++ và th viện lập trình MFC

Chơng II: Cấu trúc cây đỏ đen

Trang 4

Mặc dù rất cố gắng để hoàn thành đồ án, xong thời gian có hạn và kinh nghiệm kiến thức cha nhiều nên còn có nhiều thiếu sót cần đợc bổ sung vì vậy tôi rất mong nhận đợc sự góp ý và giúp đỡ của thầy cô và các bạn để chơng trình ngày càng hoàn thiện hơn.

Tôi xin chân thành cảm ơn cô giáo, tiến sỹ Phan Lê Na đã tận tình hớng dẫn và giúp đỡ tôi hoàn thành đồ án này Tôi cũng xin cảm ơn các thầy cô giáo trong khoa CNTT cũng nh các bạn trong lớp 45K đã đóng góp nhiều ý kiến bổ ích cho đồ án của tôi

Vinh , ngày 15 tháng 4 năm 2009 Sinh viên thực hiện:

Hoàng Đức Hiển

Trang 5

Chơng I Giới thiệu ngôn ngữ Visual C++ và

th viện lập trình MFC

Visual C++ nằm trong bộ Microsoft Visual Studio Đây là một môi ờng lập trình đa năng dành cho ngôn ngữ C/C++ và vì là một môi trờng lập trình trên hệ điều hành Windows nên Visual C++ cho phép lập trình viên thực hiện rất nhiều công việc, hỗ trợ lập trình viên việc coding, thiết kế giao diện… Trong Visual C++ chúng ta có thể tạo đợc: các ứng dụng trên Windows, ActiveX, hay th viện liên kết động DLL Visual C++ có nhiều công cụ giúp…việc thiết kế giao diện cho chơng trình, kiểm lỗi và sửa lỗi

tr-Th viện MFC (Microsoft Foundation Class) là th viện tập hợp các lớp ớng đối tợng đóng gói các hàm API của Windows và các kiểu dữ liệu đặc biệt Bên cạnh sử dụng th viện MFC trong Visual C++, chúng ta có thể sử dụng các hàm C chuẩn

h-I Các công cụ hỗ trợ lập trình

1 Visual Assist

Đây là một công cụ Add-in vào môi trờng lập trình Nó giúp cho việc hiển thị các hàm, các biến, các đoạn chơng trình một cách rõ ràng (thông qua màu sắc của các biến, kiểu dữ liệu, hàm, từ khoá ) Một đoạn code trong Visual C++ có sử dụng Visual Assist cung cấp một bộ phận hoạt động rất hiệu quả Các chức năng của bộ phận bao gồm : tự động điền tên biến, tên hàm chỉ sau khi gõ 1 vài ký tự, hiển thị các prototype của một hàm (có sẵn trong th viện hay chỉ mới đợc tạo ở 1 lớp nào đó)…

Trang 6

2 MSDN (Microsoft Developer Network)

MSDN Có thể xem nó nh một tập cho những ai lập trình trên các ngôn ngữ từ C/C++, Visual Basic cho đến C#, VB.Net

Trong MSDN, ngoài các tài liệu giới thiệu chi tiết về việc sử dụng những hàm, lớp , còn có các quyển sách, bài báo kỹ thuật, hay các mẫu code…

có thể đợc tận dụng trong việc lập trình

II MÔI TRƯờNG LậP TRìNH

1 Tạo project sử dụng th viện MFC

Có thể chia màn hình làm việc thành ba vùng khác nhau :

1.1 Vùng 1 Workspace

Đây là không gian tơng tác giúp lập trình viên nhanh chóng chuyển qua lại giữa các lớp:

ClassView cho thấy hình ảnh tổng thể project dới dạng các lớp Trong

classview, lập trình viên có thể biết đợc cấu tạo của một lớp (có những hàm, biến nào; tầm vực hoạt động của các hàm, các biến – public, protected, private)

ResourceView cho thấy đợc những tài nguyên có trong project (dialog,

menu, toolbar, bitmap, icon, ) Thực chất đây là phần hiện thực hoá những…gì thể hiện trong tập tin resource.h và rc

FileView cho thấy những tập tin có trong project : source file, header

file, resoure file và những tập tin đợc thêm vào sau

1.2 Vùng 2

Đó là vùng dùng để thiết kế giao diện (các dialog, menu, toolbar) hay viết code cho project

1.3 Vùng 3 - Output

Vùng thể hiện các thông báo lỗi (nếu có), các kết quả thực thi (khi có

sử dụng Macro), nội dung của biến (ở chế độ Debug) …

2 Các control chuẩn

Trang 7

2.1 Hộp Control

Trong môi trờng lập trình Visual C++ có thể thực hiện việc kéo thả các control chuẩn trong khi thiết kế giao diện Bật/tắt hộp control khi thiết kế thựchiện nh sau: nhấn phím chuột phải trên thanh toolbar, một menu nh bên tayphải xuất hiện, chọn (không chọn) chức năng Controls Có thể vào Tools\ Customize, check vào toolbars ở vị trí Controls

2.2 Các control chuẩn

Visual C++ cho phép chèn các control chuẩn sau đây vào trong ứng dụng : PictureBox, Static Text (Label), Edit box (Textbox), GroupBox, Button, Checkbox, RadioButton, ComboBox, ListBox, Scrollbar, Spin, Progressbar, Slider, TreeControl, Tab Control, Animate, RichEdit, DateTime, Month Calendar, IP Address

2.3 Thiết lập thuộc tính cho control

Các thuộc tính của control trên Visual C++ không nhiều Tuy nhiên, có những thuộc tính đặc biệt (mặc định) của control bắt buộc lập trình viên phải nhớ để có thể thao tác nhanh chóng Mỗi control có một định danh (ID) riêng

ID chính một số nguyên duy nhất, một vài thuộc tính đáng quan tâm của các control

2.4 Control Thuộc tính mặc định

Static Text Align : canh chỉnh (trái, phải, giữa) dòng chữ trong static

text

Center vertically : canh chỉnh đều theo chiều dọc

No wrap : không nhảy dòng nếu chiều dài dòng chữ vợt khỏi chiều

rộng của static text

Sunken, Border : đờng viền cho static text

Edit box Align text : canh chỉnh (trái, phải, giữa) dòng chữ trong static

text

Multiline : cho phép hiển thị nhiều dòng

Trang 8

Number : chỉ cho phép nhập vào số

HScroll, VScroll : thanh cuộn theo chiều ngang (H), chiều dọc (V) AutoHScroll : tự động cuộn theo chiều ngang (nếu có)

AutoVScroll : tự động cuộn theo chiều dọc (nếu có)

Password : không hiển thị ký tự nhập vào (chỉ thấy ký tự *)

Uppercase, Lowercase : chữ hoa, chữ thờng

Read-only : không cho phép gõ vào control Check box

Push-like : dạng nút nhấn (chìm/nổi)

Horizontal Alignment : canh chỉnh theo chiều ngang

Vertical Alignment : canh chỉnh theo chiều dọc

Đối với ComboBox, trong thiết kế : kéo chiều cao của ComboBox đến

vị trí tối đa mong muốn ComboBox có thể xổ xuống

Data : Vùng dữ liệu thêm vào trong Listbox, ComboBox khi thiết kế

Nhấn Ctrl-Enter để kết thúc một mục

Sort : Dữ liệu sẽ đợc sắp xếp theo thứ tự tăng giần khi xuất hiện trong

Listbox, ComboBox

Multicolumn : xuất hiện thành nhiều cột (phụ thuộc vào chiều rộng).

2.5 Sự kiện và xử lý sự kiện

a Sự kiện

Trên Windows, các sự kiện xảy ra liên tục (khi có một tác động của

ng-ời dùng, hay của chơng trình lên hệ thống) Windows sẽ tiếp nhận các sự kiện rồi gửi đến cho các ứng dụng đang chạy

Trang 9

khi chọn Add Functions, môi trờng lập trình sẽ tự động thêm khai báo hàm, cấu trúc hàm vào những vị trí thích hợp trên tập tin CPP và H của lớp.

2.6 Debug chơng trình

Vùng màn hình Context cho biết giá trị của các biến có trong đoạn

chơng trình đang chạy (kiểm lỗi) Các biến này đợc đa vào một cách tự động

Vùng màn hình Watch cho biết giá trị của các biến do lập trình viên mong muốn Vùng màn hình Call Stack cho biết thứ tự gọi hàm của chơng trình

Vùng màn hình Registers cho biết giá trị các thanh ghi

Trang 10

Chơng II cấu trúc cây đỏ đen

I Khái quát cây đỏ đen

1 Giới thiệu cây nhị phân tìm kiếm (binary search tree)

Cây nhị phân tìm kiếm (BST) ứng với n khoá k1, k2, kn là một cây nhị phân mà mà mỗi nút của nó đều đợc định danh bởi mọt khoá nào đó trong các khoá đã cho và đối với mọi nút trên cây tính chất sau đây luôn luôn đợc thoả mãn

- Mọi khoá thuộc cây con trái nút đó đều nhỏ hơn khoá ứng với nút đó

- Mọi khoá thuộc cây con phải nút đó đều lớn hơn khoá ứng với nút đó

ở đây thứ tự chọn ta vẫn quy ớc là thứ tự tăng dần đối với số và thứ tự

từ điển đối với chữ

Sau đây là ví dụ về cây nhị phân đối với khoá là số và là chữ

Hình 1: Minh hoạ cây bằng số và cây bằng chữ

3 4

1

7

2 5

6 6

5 0

7 1

p

Trang 11

2 Giải thuật tìm kiếm

Đối với một cây nhị phân tìm kiếm để xem một khoá X nào đó có trên cây đó không ta có thể thực hiện nh sau:

So sánh X với khoá ở gốc và một trong 4 tình huống sau đây sẽ xuất hiện:

1) 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 thoã mãn

2) X trùng với khoá ở gốc: Phép tìm kiếm đợc thoả mãn

3) X nhỏ hơn khoá ở gốc: tìm kiếm đợc 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ự

4) X lớn hơn khoá ở gốc: tìm kiếm đợc thực hiện tiếp tục bằng cách xét cây con phải của gốc với cách làm tơng tự

Ví dụ: Xét cây ở hình 1, nếu X=68 ta sẽ thực hiện:

- So sánh X với 34: X > 34 ta chuyển sang cây con phải;

- So sánh X với 66: X > 66, ta chuyển sang cây con phải;

- So sánh X với 71: X < 71 ta chuyển sang cây con trái;

- So sánh X với 68: X = 68 vậy tìm kiếm đã đợc thoả;

Nhng nếu X = 30 thì:

- So sánh X với 34: X < 34, ta chuyển sang cây con trái;

- So sánh X với 17: X > 17, ta chuyển sang cây con phải;

- So sánh X với 25: X > 25, ta chuyển sang cây con trái;

Nhng cây con phải rỗng vậy phép tìm kiếm không thoả

Nếu sau phép tìm kiếm không thoả ta bổ sung luôn X vào cây nhị phân tìm kiếm (nh ví dụ vừa xét ta bổ sung khoá 30 vào thành con phải của nút 25)

ta thấy phép bổ sung này thực hiện rất đơn giản và không làm ảnh hởng gì tới

vị trí của các khoá hiện có trên cây, tính chất của cây nhị phân tìm kiếm vẫn

đợc đảm bảo

Ta có thể dựng đợc cây nhị phân tìm kiếm ứng với một dãy khoá đa vào bằng cách liên tục bỏ sung các nút ứng với từng khoá, bắt đầu từ một cây

Trang 12

rỗng Tất nhiên ban đầu phải dựng lên nút gốc cây ứng với khoá đầu tiên sau

đó ứng với các khoá tiếp theo, tìm trên cây không thấy thì bổ sung vào

Nh vậy với giải thuật BST nêu trên, ta thấy cây nhị phân tìm kiếm dựng

đợc hoàn toàn phụ thuộc vào dãy khoá đa vào Nh vậy có nghĩa là, trong quá trình xử lý tự động ta không thể biết trớc đợc cây sẽ phát triển ra sao, hình dạng của nó sẽ thế nào Rất có thể đó là một cây nhị phân hoàn chỉnh (ma ta gọi là cây cân đối, ngay cả khi nó cha đầy đủ) chiều cao của nó là [log2(n+1)], nên chí phí tìm kiếm có cấp độ lớn chỉ là O (log2n): Một trờng hợp rất thuận lợi mà ta luôn mong đợi Nhng cũng có thể đó là một cây nhị phân suy biến không khác gì một danh sách tuyến tính mà tìm kiếm trên cây đó chính là tìm kiếm tuần tự với chi phí có cấp O(n)

3 Loại bỏ trên cây tìm kiếm nhị phân

Khi một nút ứng với một khoá nào đó (đợc chỉ định) bị loại ra khỏi cây nhị phân tìm kiếm thì vấn đề gì sẽ xẩy ra?

Việc xử lý sẽ không còn đơn giản nh khi bổ sung nữa vì để đảm bảo

đ-ợc phần cây còn lại vẫn là một cây nhị phân tìm kiểm ta sẽ phải “sửa” lại cây nghĩa là tìm “nút thay thế nó” để nhận các con trỏ mà trớc đây trỏ tới nó và chứa các con trỏ cần thiết khác

Nếu nút bị loại bỏ là nút lá, ta không cần phải tìm nút thay thế nữa Mối nối cũ trỏ tới nó (từ nút cha) sẽ đợc thay bởi mối nối không

Nếu nút bị loại bỏ la nút “nửa lá”, nghĩa là nó chỉ có cây con trái hoặc cây con phải thì nút thay thế nó chính là gốc cây con trái hoặc cây con phải

đó Mối nút cũ trỏ tới nó nay sẽ trỏ tới nút thay thế này

Trờng hợp tổng quát: khi nút bị loại bỏ có cả cây con trái lẫn cây con phải, thì nút thay thế nó hoặc là nút ứng với khoá nhỏ hơn ngay sát trớc nó (nút cực phải của cây con trái đó) hoặc là nút ứng với khoá lớn hơn ngay sát sau nó (nút cực trái của cây con phải nó) Nh vậy sẽ phải thay đổi một số mối nối các nút:

- Nút cha của nút bị loại bỏ;

Trang 13

- Nút đợc chọn làm nút “thay thế”

- Nút cha của nút đợc chọn làm nút thay thế

Hình sau đây sẽ minh hoạ các trờng hợp trên

Trong trờng hợp này nút thay thế đợc chọn là nút cực phải của cây con trái

Hình 2 Chèn các nút vào cây

Chỉ nút bị loại bỏ

chỉ cây con Trước

AB

AB Sau

AB

C

A

B C

Trường hợp nút nữa lá

A

CB

DEF

A

E

CB

D

F

Trương hợp tổng quát

Trang 14

4 Cây đỏ đen

Nh ta đã biết, cây tìm kiếm nhị phân thông thờng có những thuận lợi lớn về mặt lu trữ và truy xuất dữ liệu trong phép toán tìm kiếm thêm vào hay loại bỏ một phần tử Do đó, cây tìm kiếm nhị phân xem ra là một cấu trúc lu trữ dữ liệu tốt

Tuy nhiên trong một số trờng hợp cây tìm kiếm nhị phân có một số hạn chế Nó hoạt động tốt nếu dữ liệu đợc chèn vào cây theo thứ tự ngẫu nhiên Tuy nhiên, nếu dữ liệu đợc chèn vào theo thứ tự đã đuợc sắp xếp sẽ không hiệu quả Khi các trị số cần chèn đã đuợc sắp xếp thì cây nhị phân trở nên không cân bằng Khi cây không cân bằng, nó mất đi khả năng tìm kiếm nhanh (hoặc chèn hoặc xóa) một phần tử đã cho

Chúng ta khảo sát một cách giải quyết vấn đề của cây không cân bằng:

đó là cây đỏ đen, là cây tìm kiếm nhị phân có thêm một vài đặc điểm Có nhiều cách tiếp cận khác để bảo đảm cho cây cân bằng: chẳng hạn cây 2-3-4 Tuy vậy, trong phần lớn trờng hợp, cây đỏ đen là cây cân bằng hiệu quả nhất,

ít ra thì khi dữ liệu đợc lu trữ trong bộ nhớ chứ không phải trong những tập tin

Trớc khi khảo sát cây đỏ đen, hãy xem lại cây không cân bằng đợc tạo

ra nh thế nào

Trang 15

Hình 3 Các node đợc chèn theo thứ tự tăng dầnNhững nút này tự sắp xếp thành một đờng không phân nhánh Bởi vì mỗi nút lớn hơn nút đã đợc chèn vào trớc đó, mỗi nút là con phải Khi ấy, cây

bị mất cân bằng hoàn toàn Nếu ta chèn những mục (item) theo thứ tự giảm dần, mỗi nút sẽ là con trái của nút cha của chúng - cây sẽ bị mất cân bằng về phía bên kia

* Độ phức tạp:

Khi cây một nhánh, sẽ trở thành một danh sách liên kết, dữ liệu sẽ là một chiều thay vì hai chiều Trong trờng hợp này, thời gian truy xuất giảm về O(n), thay vì O(logn) đối với cây cân bằng

Để bảo đảm thời gian truy xuất nhanh O(logn) của cây, chúng ta cần phải bảo đảm cây luôn luôn cân bằng (ít ra cũng là cây gần cân bằng) Điều này có nghĩa là mỗi nút trên cây phải có xấp xỉ số nút con bên phải bằng số nút con bên trái

Một cách tiếp cận giải quyết vấn đề cân bằng lại cây: Đó là cây đỏ- đen

là cây tìm kiếm nhị phân vì thế nó có các tính chất của cây tìm kiếm nhị phân

Ví dụ : Nút con trái nhỏ hơn nút cha, nút cha nhỏ hơn nút con phải, bên cạnh

đó cây đỏ đen còn đợc bổ sung một số đắc điểm

Trong cây đỏ đen, việc cân bằng đợc thực thi trong khi chèn, xóa Khi thêm một phần tử thì thủ tục chèn sẽ kiểm tra xem tính chất cân bằng của cây

có bị vi phạm hay không Nếu có, sẽ xây dựng lại cấu trúc cây Bằng cách này, cây luôn luôn đợc giữ cân bằng

4.1 Quy tắc đỏ đen.

Cây đỏ đen là một cây nhị phân tìm kiếm (BST) tuân thủ các quy tắc sau:

- Mọi nút phải là đỏ hoặc đen

- Nút gốc và các nút lá phải luôn luôn đen

- Nếu một nút là đỏ, những nút con của nó phải đen

- Mọi đờng dẫn từ gốc đến một lá phải có cùng số lợng nút đen

Trang 16

Khi chèn (hay xóa) một node mới, cần phải tuân thủ các quy tắc trên -gọi là quy tắc đỏ đen Nếu đợc tuân thủ, cây sẽ đợc cân bằng

Hình 4 Một ví dụ về cây đỏ đen

Số lợng nút đen trên một đờng dẫn từ gốc đến lá đợc gọi là chiều cao

đen (black height) Ta có thể phát biểu quy tắc 4 theo một cách khác là mọi ờng dẫn từ gốc đến lá phải có cùng chiều cao đen

đ-Cụ thể:

Một cây đỏ đen n- nút Có: Height <= 2 log(n+1)Height : Chiều cao câyTính chất: Height <= 2 * bh(x) Thời gian tìm kiếm: O( logn )

Trang 17

II Các thuật toán cơ bản của cây đỏ đen

1 Thêm một nút mới

Chúng ta sẽ xem xét việc mô tả qui trình chèn Gọi X, P, và G để chỉ

định nhãn những nút liên quan X là nút vi phạm quy tắc ( X có thể là một nút mới đợc chèn, Hoặc nút con khi nút cha và nút con xung đột đỏ-đỏ, nghĩa là

có cùng màu đỏ)

- X là một nút cho trớc

- P là nút cha của X

- G là nút ông bà của X (nút cha của P)

Trong quá trình thêm vào nút mới có thể vi phạm các quy tắc của cây

đỏ đen, chúng ta sẽ thực hiện các thao tác sau đây:

- Các phép lật màu trên đờng đi xuống

- Các phép quay khi nút đã đợc chèn

- Các phép quay trên đờng đi xuống

1.1 Các phép lật màu 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

Để bảo đảm không vi phạm các quy tắc màu, cần phải tiến hành các phép lật màu khi cần theo quy tắc nh sau: 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 đỏ, chúng ta đổ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 vẫn giữ màu là đen)

Để biết đợc phép lật màu ảnh hởng đến quy tắc đỏ đen: Ta gọi nút ở

đỉnh tam giác, nút có màu đỏ trớc phép lật là P (P thay cho node cha) Ta gọi hai nút con trái và phải của P là X1 và X2 Xem hình 4a

Xem hình lật màu sau:

Trang 18

Hình 5 Lật màu

a Trớc khi lật màu b Sau khi lật màu

Chúng ta nhận thấy sau khi lật màu chiếu con đen của cây không đổi

Nh vậy phép lật màu không vi phạm quy tắc 4 Mặc dù quy tắc 4 không bị vi phạm qua phép lật, nhng quy tắc 3 (một nút con và nút cha không thể đồng 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 chuyển từ đen sang đỏ, nhng nếu nút cha của P là đỏ, thì sau khi đổi màu, ta sẽ có hai nút đỏ trên một hàng

Điều này cần phải đợc chuẩn bị truớc khi đi xuống theo cây để chèn nút mới Ta có thể giải quyết trờng hợp này bằng một 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 quy tắc 2 và quy tắc 3 (xung đột đỏ-đỏ) Trong trờng hợp này, chiều cao đen trên mỗi đờng đi từ nút gốc tăng lên 1, do đó quy tắc 4 cũng không bị vi phạm

1.2 Các phép quay khi chèn 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à thực hiện những thao tác hợp lý

Trang 19

Nh đã xét ở trên, nút mới đợc chèn mà ta 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 5:

Hình 6 Các biến dạng của nút đợc chèn

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

Ngày đăng: 15/12/2015, 07:14

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w