CTDL2_CH04_CayDoDen

Preview:

Citation preview

Đại Học Sư Phạm Tp. Hồ Chí MinhĐại Học Sư Phạm Tp. Hồ Chí Minh

CẤU TRÚC DỮ LI ỆU 2 CẤU TRÚC DỮ LI ỆU 2

Chương 04: CÂY ĐỎ ĐEN

Ôn tập cây nhị phân

• Xem lại các kiến thức liên quan đến cây nhị phân [tìm kiếm [cân bằng]]]

• Độ cao của cây nhị phân tìm kiếm cân bằng N node là O(logN)

• Cây nhị phân cân bằng có chi phí thấp nhất.

22CTDL2 – HIENLTHHIENLTH, HCMUP

• Cây nhị phân cân bằng có chi phí thấp nhất.• Các loại cây tìm kiếm cân bằng:

– AVL Tree– Red – Black Tree– AA Tree– Splay Tree

a. Khái niệm cây đỏ đen

-Là cây nhị phân tìm kiếm-Đưa thêm yếu tố màu (RED, BLACK ) để làm cơ sở cho sự cân bằng.

33CTDL2 – HIENLTHHIENLTH, HCMUP

cơ sở cho sự cân bằng.

Các tính chất

1. Mọi nút chỉ có thể là đỏ (RED) hoặc đen(BLACK)

2. Nút gốc mang màuđen. Mọi nút lá (NIL)mangmàuđen.

44CTDL2 – HIENLTHHIENLTH, HCMUP

mangmàuđen.3. Nếu 1 nút làđỏ thì con của nó phải là đen

(nghĩa là không có 2 nútđỏ liên tiếp)4. Tất cả cácđường đi từ một nút đã cho tới các

lá chứamột số như nhaucác nútđen.

Ví dụ:

55CTDL2 – HIENLTHHIENLTH, HCMUP

Cây đỏ đen

• Chiều cao đen (black height – hb(x)) là số node đen trên đường đi từ node x đến lá (không bao gồm x)

• Từ quy tắc [4] �Không thể tồn tại node cha và node con cùng đỏ. Khi cây đỏ đen vi

66CTDL2 – HIENLTHHIENLTH, HCMUP

và node con cùng đỏ. Khi cây đỏ đen vi phạm quy tắc này gọi là hiện tượng xung đột đỏ - đỏ.

Nhận xét

• Cây đỏ đen có N nút trong (internal node) có chiều cao tối đa là 2logn(N+1)

• Chiều cao của cây (h) <= 2 * chiều cao đen (hb)

• Các nút lá là NIL (nút ngoài – external node)

77CTDL2 – HIENLTHHIENLTH, HCMUP

• Các nút lá là NIL (nút ngoài – external node) luôn là node đen.

• Mỗi cạnh đến 1 node đen được gọi là cạnh đen.

• Thời gian tìm kiếm O(logN)

Cây đỏ đen

Cấu trúc lưu trữ:• Thông tin lưu trữ tại node (key)• Địa chỉ node gốc của cây con bên trái

(*pLeft)

88CTDL2 – HIENLTHHIENLTH, HCMUP

• Địa chỉ node gốc của cây con bên phải (*pRight)

• Địa chỉ node cha (*pParent)• Thuộc tính màu của node (color)

b. Biểu diễn cây đỏ - đen

struct Node{

int Key; //Dữ liệuNode* pLeft, *pRight;int color; //RED - BLACKNode* pParent; //Trỏ đến nút cha

99CTDL2 – HIENLTHHIENLTH, HCMUP

Node* pParent; //Trỏ đến nút cha };

typedef Node* pNode;struct RBTree{

pNode root;};

c. Một số thao tác đơn giản (tự viết)

+ Tìm kiếm và duyệt cây (giống BST)+ Thêm node mới+ Xóa node

1010CTDL2 – HIENLTHHIENLTH, HCMUP

+ Khởi tạovoid Init (RBTree &t);

+ Kiểm tra r ỗng int isEmpty (RBTree t);

d. Xuất cây ra màn hình

void PrintTree (RBTree t){

if (isEmpty(t)){

1111CTDL2 – HIENLTHHIENLTH, HCMUP

cout<<“Cây rỗng”;return;

}Print(t.root, 0):

}

d. Xuất cây ra màn hình (tt)

void Print (pNode p, int level){

if (!p){

textcolor(BLACK);

1212CTDL2 – HIENLTHHIENLTH, HCMUP

textcolor(BLACK);for (int i = 0 ; i < level; ++ i){

cout<<“ “;cout<<“NULL “<<endl;

}

d. Xuất cây ra màn hình (tt)

Print(p->pRight, level + 1);for (i= 0; i < level;i++)

cout<<“ “;if (p->color == RED)

textcolor (RED);else

1313CTDL2 – HIENLTHHIENLTH, HCMUP

elsetextcolor (BLACK);cout<<p->Key;

Print(p->pLeft , level +1)}

}

e. Chèn một nút vào cây đỏ đen

Chèn một nút như trong cây tìm kiếm nhị phân bình thường và gán cho nómàu đỏ.

B1. Tìm vị trí thích hợp để chèn khoá KB2. Phát sinh 1 nút mới có khoá K, màu

1414CTDL2 – HIENLTHHIENLTH, HCMUP

B2. Phát sinh 1 nút mới có khoá K, màu đỏ (RED) và gắn liên kết tại vị trí tìm được.B3. Hiệu chỉnh lại cây nếu có vi phạm tính chất (tô màu lại & quay)

Các tính chất có thể vi phạm khi thêm nút

• Mọi node là đỏ hoặc đen � OK• Node gốc là đen � Not OK nếu thêm node

mới là node gốc• Các node lá (NIL) phải luôn đen � OK

1515CTDL2 – HIENLTHHIENLTH, HCMUP

• Nếu 1 node là đỏ, các node con của nó phải là đen � Not OK nếu cha node thêm màu đỏ� 2 node đỏ liên tiếp.

• Mọi đường dẫn từ gốc đến lá chứa một số lượng node đen như nhau � OK

void RBTree_Insertion(RBTree &root, int key){

x = getNode(key,RED, NIL);BSTree_Insert(root, x);

1616CTDL2 – HIENLTHHIENLTH, HCMUP

BSTree_Insert(root, x);Insertion_Fixup(root, x);

}

Gọi:

• X: Con trỏ, trỏ đến nút vừa chèn vào

• P: Con trỏ, nút cha của nút trỏ bởi x

• U: Con trỏ, trỏ đến nút

gg

uu

1717CTDL2 – HIENLTHHIENLTH, HCMUP

• U: Con trỏ, trỏ đến nút anh em của nút trỏ bởi p

• G: Con trỏ, trỏ đến nút cha của nút trỏ bởi p

pp

xx xx

uu

Cháu ngo ại Cháu nội

Một số định nghĩa

X là một node cháu ngoạinếu nó nằm cùng bênU U

1818CTDL2 – HIENLTHHIENLTH, HCMUP

nếu nó nằm cùng bênnode cha P và P cùng bênnode cha G.Ngược lại, X gọi là nodecháu nội .

U U

UU

* Phép quay phải tại y

yy

γ

1919CTDL2 – HIENLTHHIENLTH, HCMUP

xx

α β

γ

Phép quay (như BST)

yy

γxx

Quay phải

2020CTDL2 – HIENLTHHIENLTH, HCMUP

γxx

α βyy

γα

β

Quay trái

Các trường hợp sau khi thêm:

• Nếu p đen � Dừng (1)• Nếu p đỏ:

– Nếu u đỏ, đảo màu 3 nút p, u, g (2)

– Nếu u đen:

2121CTDL2 – HIENLTHHIENLTH, HCMUP

• Nếu x là cháu ngoại của g: Thực hiện 1 phép quay (3)

• Nếu x là cháu nội của g: Thực hiện 2 phép quay (4)

Trường hợp 1

• P đen � Bình thường (dừng)

2222CTDL2 – HIENLTHHIENLTH, HCMUP

Trường hợp 2

• P đỏ, U đỏ � Đảo màu G, P, U

gg gg

2323CTDL2 – HIENLTHHIENLTH, HCMUP

gg

pp

xx

uu

gg

pp

xx

uu

X

P

G

U

G

X

2424CTDL2 – HIENLTHHIENLTH, HCMUP

X

P U

Case 2 – P, U is Red

Just Recolor and move up

Trường hợp 3

• P đỏ, U đen, x là cháu ngoại � Quay tại P; Đổi màu P, G

2525CTDL2 – HIENLTHHIENLTH, HCMUP

X

P

G

U

S P

2626CTDL2 – HIENLTHHIENLTH, HCMUP

X

X G

S U

Case 3 – Zig-Zig

Single Rotate P around G

Recolor P and G

Trường hợp 4

• P đỏ, U đen, x là cháu nội � Quay tại P (trở thành cháu ngoại), sau đó Quay tại G; Đổi màu P, G

2727CTDL2 – HIENLTHHIENLTH, HCMUP

Tương tự TH3

X

P

G

U

S X

2828CTDL2 – HIENLTHHIENLTH, HCMUP

S

P G

SU

Case 4 – Zig-Zag

Double RotateX around P; X around G

Recolor G and X

Hàm quay trái (tương tự cho quay phải)void LeftRotate(RBTree t, pNode x){

pNode y = x->pRight; x->pRight = y->pLeft; //Bên phải x là

if (p->pLeft !=NULL)p->pLeft ->pParent = x;//cha là x

β

β

2929CTDL2 – HIENLTHHIENLTH, HCMUP

p->pLeft ->pParent = x;//cha là xp->pParent = x->pParent;// cha của x là cha của y

//nếu x là nút gốcif (x->pParent == NULL)

t.root = y; //gốc mới sẽ là yelse

β

Hàm quay trái (tt)

//trường hợp else => x không phải là gốc

//Nếu x là con trái của cha nóif (x == (x->pParent)->pLeft)

x->pParent->pLeft = yelse

3030CTDL2 – HIENLTHHIENLTH, HCMUP

elsex->pParent->pRight = y;

y->pLeft = x;x ->pParent = y;

}

Ví dụ: Chèn một nút vào cây đỏ đen

Lần lượt chèn vào các nút có giá trị: 50, 75, 25, 80, 100, 110, 105

5050“ông” x

3131CTDL2 – HIENLTHHIENLTH, HCMUP

25257575

8080

x

“cha” x“bác” x

TH2: Cha, bác x đều có màu đỏ

- Cho cha và bác thành màu đen-Ông của x thành màu đỏ(lưu ý: nút gốc qui ước là màu đen)

5050 “ông” x

3232CTDL2 – HIENLTHHIENLTH, HCMUP

8080

x

“cha” x“bác” x2525

7575

TH3: Bác x đều có màu đen x là con phải của cha x

Quay trái tại ôngcủa x đồng thời đổi màu cha của x và ôngcủa x

5050

7575

5050

3333CTDL2 – HIENLTHHIENLTH, HCMUP

8080

2525

7575

100100 x

2525

7575100100

x

8080

5050

25258080

3434CTDL2 – HIENLTHHIENLTH, HCMUP

7575100100

110110

105105

x

TH4: x là con trái, cha x là phảihoặc x là con phải, cha x là trái

Quay trái (phải) tại cha (không đổi màu)5050

25258080

3535CTDL2 – HIENLTHHIENLTH, HCMUP

2525

7575100100

105105

110110

TH.3

CODEvoid Insert(RBTree &t, int k){-Tìm vị trí cần chèn k-Phát sinh 1 nút x có khoá là k, màu đỏ, và chèn vào vị trí cần chèn//Bắt đầu cân bằng

while (x!=t.root && x->pParent->color==RED)

3636CTDL2 – HIENLTHHIENLTH, HCMUP

while (x!=t.root && x->pParent->color==RED){

//cha x là con trá của ông xif ( x -> p == x->pParent->pParent->pLeft){

//y là “bác” của xy = x->pParent->pParent->pRight;

}

CODE

if (y->color == RED){ //TH1x->pParent->Color = BLACK;y->color = BLACK;x->pParent -> pParent -> color = REDx = x->pParent -> pParent;

3737CTDL2 – HIENLTHHIENLTH, HCMUP

x = x->pParent -> pParent;}

CODEelseif (x== x->pParent->pRight){ //TH3

x = x->pParent;LeftRotate(t,x);

}

3838CTDL2 – HIENLTHHIENLTH, HCMUP

}//TH2 luôn xảy ra sau đóX->pParent ->color = BLACK;X->pParent->pParent->color = RED;RightRotae(t,x->pParent->pParent);}

CODE

else //TH: cha của x là con phải của “ông”x{

3939CTDL2 – HIENLTHHIENLTH, HCMUP

{//Làm tương tự như trên,đổi pRight<->pLeft

}t.root -> color = BLACK;

Red-Black Trees

Insertion example

11

2 14

4040CTDL2 – HIENLTHHIENLTH, HCMUP

151 7

5 8

4 Violation of rule( after 4 added to the tree)

Red-Black Trees

Insertion example

11

2 14

4141CTDL2 – HIENLTHHIENLTH, HCMUP

151 7

5 8

4 Case 1

Red-Black Trees

Insertion example

11

7 14

4242CTDL2 – HIENLTHHIENLTH, HCMUP

152 8

4

1 5

Case 2

Red-Black Trees

Insertion example

2

77

11

4343CTDL2 – HIENLTHHIENLTH, HCMUP

4

1 5 14

15

8

Case 3

4444CTDL2 – HIENLTHHIENLTH, HCMUP

4545CTDL2 – HIENLTHHIENLTH, HCMUP

f. Huỷ một nút trong cây đỏ đen

• Tìm và hủy giống cây NPTK (BST).• Kiểm tra tính cân bằng � mất cân bằng �

cân bằng lại.Sau khi xóa:• Nếu y đỏ � Không cần cân bằng lại.

4646CTDL2 – HIENLTHHIENLTH, HCMUP

• Nếu y đỏ � Không cần cân bằng lại.• Nếu y đen:

– Tất cả các đường đi con từ gốc đến nút lá (qua y) sẽ ít hơn 1 nút đen so với những đường đi còn lại (vi phạm t/c 4)

– Nếu p và x cùng đỏ thì vi phạm t/c 3.

Gọi:

• y: Con trỏ, trỏ đến nút bị xóa thật sự

• x: Con trỏ, trỏ đến nút concủa nút trỏ bởi y, sẽ thay thế nút y

pp

ww

4747CTDL2 – HIENLTHHIENLTH, HCMUP

nút y

• w: Con trỏ, trỏ đến nút anh em của nút trỏ bởi x

• p: Con trỏ, trỏ đến nút cha của nút trỏ bởi y

xx

wwyy

Dấu hiệu đen (black token)

• Được gán cho nút trỏ bởi x (nút con thật sự của nút bị xóa y)

• Báo hiệu con đường đi qua các nút có chứa nó sẽ ít hơn những con đường khác 1 nút đen

• “dấu hiệu đen” đi ngược lên cây cho tới khi chiều

4848CTDL2 – HIENLTHHIENLTH, HCMUP

• “dấu hiệu đen” đi ngược lên cây cho tới khi chiều cao cây được đảm bảo.

• Nút chứa dấu hiệu đen, bản thân là:– Nút đen � nút đen kép– Nút đỏ � nút đỏ đen

• Là khái niệm trừu tượng, không cài đặt

Quy ước

Do khi xoá và cân bằng cây, sẽ có nhiều trường hợp cần phải xử lý, trong đó có việc kiểm tra nút là nút NULL?

Giải pháp : thay tất cả các nút NULL bằng 1

4949CTDL2 – HIENLTHHIENLTH, HCMUP

Giải pháp : thay tất cả các nút NULL bằng 1 nút đặc biệt, có tên là Null. Đây là nút thật sự luôn có màu đen, các trị của nó (key, trái, phải, cha) được gán bất kỳ

Quy ước

pNode Null;void main(){

Null -> color = BLACK;Null ->pParent= Null->pLeft=Null->pRight = NULL;

5050CTDL2 – HIENLTHHIENLTH, HCMUP

Null ->pParent= Null->pLeft=Null->pRight = NULL;Null -> Key = 0;

}

Phân tích

Khi nào cần cân bằng lại cây?

+ Khi nút bị xoálà nút có màu đen

5151CTDL2 – HIENLTHHIENLTH, HCMUP

Khi cân bằng cần để ý đến sự vi phạm t/c nào?

+ t/c chiều cao cây đen

Phân tích

Khi huỷ một nút đen thì chiều cao đen của nhánh chứa nó sẽ bị sụt giảm 1 đơn vị, ta có thể:

+ Biến nút đen cùng cấp ở cây con còn lại thành nút đỏ (nếu được)

5252CTDL2 – HIENLTHHIENLTH, HCMUP

thành nút đỏ (nếu được)

+ Thực hiện xoay cây để tạo sự cân bằng

=> KL: Kết hợp đổi màu và xoay cây

CODEvoid Delete(RBTree &t, int k){

//Tìm nút z cần xoáif (isEmpty(t)) return;pNode z = t.root;while (z!=Null && z->key !=k){

if (z->key > k)

5353CTDL2 – HIENLTHHIENLTH, HCMUP

if (z->key > k)z= z->pLeft;

elsez= z->pRight;

}if (z==Null)

return ; //Không tìm thấy

CODE

Xác định nút y là nút cần thực sự xoáIf (z->pLeft ==Null !! z->pRight == Null)

y = z; //z không đủ 2 con => xoáelse

5454CTDL2 – HIENLTHHIENLTH, HCMUP

else//y chỉ có thể có 1 con y = SearchStandFor(z);

CODE//Tiến hành xoá ypNode x; // x là nút con của yif (y->pLeft != Null)

x=y->pLeft; else

5555CTDL2 – HIENLTHHIENLTH, HCMUP

elsex = y->pRight;

//cha của x là cha của y//Nếu x là Null vẫn không báo lỗix->pParent = y->pParent;

CODE

if (y->pParent == Null) //y là gốct.root = x;

elseif (y->Parent->pLeft ==y)

5656CTDL2 – HIENLTHHIENLTH, HCMUP

if (y->Parent->pLeft ==y)y->pParent->pLeft = x;

elsey->pParent->pRight =x;

CODE

//Kiểm tra cân bằngif (y != z) // y là phần tử thế mạng

z->key = y->key;if (y->color == BLACK)

FIXUP(t,x); // cân bằng lại

5757CTDL2 – HIENLTHHIENLTH, HCMUP

FIXUP(t,x); // cân bằng lại

//Xoá yy->pLeft = y->pRight = y->pParent=Null;Delete y;

Cân bằng lại cây sau khi xoá một nút đen

x: con trỏ, trỏ tới nút đang thiếu đenw: con trỏ, trỏ tới nút anh/em của xp: con trỏ, trỏ tới nút cha của x

5858CTDL2 – HIENLTHHIENLTH, HCMUP

TH1: x đỏ hoặc gốc

• Nút x chứa “dấu hiệu đen” là nút đỏ (nút đỏ - đen) hay nút gốc.

Xử lý:• Tô màu nút đỏ đen sang màu đen.

5959CTDL2 – HIENLTHHIENLTH, HCMUP

• Loại bỏ dấu hiệu đen và kết thúc

TH2: x đen kép, w và 2 con w đều đen

• Đổi màu nút anh em w sang đỏ• Đổi màu P đen (bất kể P trước đó màu đỏ

hay màu đen)• Di chuyển “dấu hiệu đen” lên trên 1 cấp

(theo hướng gốc của cây)

6060CTDL2 – HIENLTHHIENLTH, HCMUP

(theo hướng gốc của cây)

TH2: x đen kép, w và 2 con w đều đenBB

AA

CC

x

EEβα

γδ ηε

w

DDAA

CC

DD

EEβ

γδ ηε

BB

α

Đổi màu w sang đỏ

6161CTDL2 – HIENLTHHIENLTH, HCMUP

γδ ηε γδ ηεBB

AA

CC

x

EEβα

γδ ηε

w

DD AA DD

β

γδ ηε

BB

αCC EE

Đổi màu w sang đỏ

TH3: x đen kép, w đỏ, 2 con w đen, p đen

• Đảo màu nút p và w• Thực hiện phép quay tại w (theo hướng

đưa w lên, p xuống � w làm ông của x)• Dấu hiệu đen vẫn chỉ vào nút x ban đầu

6262CTDL2 – HIENLTHHIENLTH, HCMUP

p

x w

w

p

x

Trở về một trong các trường hợp trên.

TH3: w đỏ

BB

DDx

DD

EEBB

Left Rotate

Đổi màu

w

6363CTDL2 – HIENLTHHIENLTH, HCMUP

AA

CC

DDx

EEβα

γδ ηε

BB

βα

AA CC

γδ

ηεĐổi màu

x w mới

TH4: x đen kép, w đen, 1 trong 2 con w đỏ

Gọi z là nút con của w có màu đỏ.

(w có ít nhất một con đỏ gọi là z)

Có 2 trường hợp xảy ra:

• 4a) z là cháu nội

• 4b) z là cháu ngoại

6464CTDL2 – HIENLTHHIENLTH, HCMUP

• 4b) z là cháu ngoại

Xử lý:

• 4a) chuyển sang 4b) nhờ phép quay và đổi màu

• 4b) được xử lý bằng phép quay và đổi màu

TH4a: w đen con trái w màu đỏ

DDx AA

Quay phải tại W

Đổi màuw xw mới

Đỏ/đen

BB

CC

BBBB

6565CTDL2 – HIENLTHHIENLTH, HCMUP

AADD

CC

x

EE

EEβα

γδ ηε

βα

AA

γ

ηε

Đổi màuw x

δDDz z mới

Xử lý

• 4a) chuyển sang 4b):– Đổi màu Z và W

– Quay tại Z (theo hướng đưa z lên, w xuống)

• Xử lý 4b)

6666CTDL2 – HIENLTHHIENLTH, HCMUP

– Quay tại W (theo hướng đưa W lên, P xuống)

– Đảo màu P, W

– Z đổi theo màu P

– Mất dấu hiệu đen

TH4b: w đen con phải w màu đỏ

DDx

BB EE

Quay trái tại cha của x

Đổi màuw

Đỏ/đen

BBDDp

6767CTDL2 – HIENLTHHIENLTH, HCMUP

AADD

EE

xBB EE

CCβα

γδ ηεβα

AA

ηεĐổi màuw

CC

γδ

z

2525 6060

5050

Cho cây đỏ đen như sau:

Bài tập áp dụng

6868CTDL2 – HIENLTHHIENLTH, HCMUP

5555 65651010 3030

Lần lượt xóa các nút sau: 55, 50.

Cây 2-3-4

+ Cây 2-3-4là câynhiều nhánh mà mỗi nodecủa nó có thể có đến bốn node con và ba mục dữ liệu.

6969CTDL2 – HIENLTHHIENLTH, HCMUP

Cây 2-3-4

Node không phải là lá:• Một node với một mục dữ liệu thì luôn

luôn có 2 con.• Một node với hai mục dữ liệu thì luôn

luôn có 3 con.

7070CTDL2 – HIENLTHHIENLTH, HCMUP

luôn có 3 con.• Một node với ba mục dữ liệu thì luôn

luôn có 4 con.Đối với mọi node với số con là k và số

mục dữ liệu là d, thì : k = d + 1

Các loại nút

7171CTDL2 – HIENLTHHIENLTH, HCMUP

2 – nodeMột mục dữ liệu2 node con.

3 – nodeHai mục dữ liệu3 node con.

4 – nodeBa mục dữ liệu4 node con.

Các trường hợp của cây 2-3-4

7272CTDL2 – HIENLTHHIENLTH, HCMUP

Các trường hợp của cây 2-3-4

7373CTDL2 – HIENLTHHIENLTH, HCMUP

2 - 3 - 4 tree

Các trường hợp của cây 2-3-4

7474CTDL2 – HIENLTHHIENLTH, HCMUP

Cấu trúc một nút

struct Node{

char key[3];

7575CTDL2 – HIENLTHHIENLTH, HCMUP

char key[3];int type; // 2 , 3, 4 – NodeNode* next[4];

};

Tổ chức cây 2-3-4

• Trong cây 2-3-4, các nút lá đều nằm trêncùng một mức. Các node ở mức trên thườngkhông đầy đủ, nghĩa là chúng có thể chứachỉ 1 hoặc 2 mục dữ liệu thay vì 3 mục.

• Lưu ý rằng cây 2-3-4 là cây cân bằng. Nó

7676CTDL2 – HIENLTHHIENLTH, HCMUP

• Lưu ý rằng cây 2-3-4 là cây cân bằng. Nóvẫn giữ được sự cân bằng khi thêm vào cácphần tử có thứ tự (tăng dần hoặc giảm dần).

Cách chèn nút

+ Bottom – up: Mở rộng cây về phía gốc,tách từ dưới lên, tràn node =>tách+ Top – Down: đi từ trên xuống, gặp nútđầy thì tách,rồi tìm vị trí thíchhợp để chèn

7777CTDL2 – HIENLTHHIENLTH, HCMUP

đầy thì tách,rồi tìm vị trí thíchhợp để chèn

Ví dụ: (xemdemo trên web)

Thêm nút

• Theo nguyên lý Top – Down (đi từ trên xuống), gặp nút đầy thì tách rồi mới chèn.

• Dữ liệu thêm luôn được chèn vào node lá.• Nếu node thêm vào chưa đầy � thêm vào

bình thường.

7878CTDL2 – HIENLTHHIENLTH, HCMUP

bình thường.• Node đầy dữ liệu (có 3 mục dữ liệu) thì tách.

Ta có 2 trường hợp:– Tách node gốc

– Tách node không phải là gốc

Tách nút gốc

• Node gốc đầy � tách trước, chèn sau

• Giả sử node gốc có 3 mục dữ liệu A, B, C (đã được sắp thứ tự). Quá trình tách:– Node mới được tạo ra để trở thành gốc mới và là cha của

node được tách.– Node mới thứ hai được tạo ra để trở thành anh em với

7979CTDL2 – HIENLTHHIENLTH, HCMUP

– Node mới thứ hai được tạo ra để trở thành anh em với node được tách.

– Mục dữ liệu C được dịch đưa sang node anh em mới.– Mục dữ liệu B được dịch đưa sang node gốc mới.– Mục dữ liệu A vẫn không đổi.– Hai node con bên phải nhất của node được phân chia bị

hủy kết nối khỏi nó và kết nối đến node mới bên phải.

Ví dụ về tách node gốc

8080CTDL2 – HIENLTHHIENLTH, HCMUP

Ví dụ Tách nút

8181CTDL2 – HIENLTHHIENLTH, HCMUP

Ví dụ Tách nút

8282CTDL2 – HIENLTHHIENLTH, HCMUP

Ví dụ về chèn nút

8383CTDL2 – HIENLTHHIENLTH, HCMUP

Ví dụ về xóa node

• Khóa k nằm trong nút lá u và u có nhiều hơn một khóa: giải phóng khóa k khỏi u .

8484CTDL2 – HIENLTHHIENLTH, HCMUP

Ví dụ về xóa node

• Khóa k nằm trong nút lá u và u chỉ có một khóa và tồn tại nút anh em v của u có nhiều hơn một khóa thì bằng phép dịch chuyển dần có thể dịch chuyển một khóa của v đến u khiến u trở thành 3-nút và quay về trường hợp 1.

8585CTDL2 – HIENLTHHIENLTH, HCMUP

Ví dụ về xóa node

• Khóa k nằm trong nút lá u và u chỉ có một khóa và tất cả các nút anh em của u chỉ có một khóa thì bằng phép gộp u với nút anh em kề nó sẽ khiến u trở thành 3-nút và quay về trường hợp 1.

8686CTDL2 – HIENLTHHIENLTH, HCMUP

Ví dụ về xóa node

• Khóa k nằm trong nút trong u: Khi đó tìm khóa tiền nhiệm hoặc khóa kế vị của k (khóa này luôn nằm trong nút lá). Thay k bởi khóa đó, và giải phóng khóa đó tkhỏi nút chứa nó (quay về trường hợp 1). Tuy việc dùng khóa tiền nhiệm hay kế vị đều được, nhưng nên chọn khóa nào trong chúng nằm trong nút có hai khóa trở lên, nếu cả hai đều nằm

8787CTDL2 – HIENLTHHIENLTH, HCMUP

nằm trong nút có hai khóa trở lên, nếu cả hai đều nằm trong các 2-nút thì chọn khóa nào cũng được.

Đánh giá

+ Cây cân bằng+ Chi phí tìm kiếm là O(log(n))

8888CTDL2 – HIENLTHHIENLTH, HCMUP

+ Chi phí tìm kiếm là O(log(n))

Biến đổi cây 2-3-4 sang cây đỏ đen

• Biến đổi bất kỳ 2-node ở cây 2-3-4 sang node đen ở cây đỏ-đen.

8989CTDL2 – HIENLTHHIENLTH, HCMUP

Biến đổi cây 2-3-4 sang cây đỏ đen

• Biến đổi bất kỳ 3-node sang node con C (với hai con của chính nó) và node cha P (với các node con C và node con khác). C được tô màu đỏ và P được tô màu đen

9090CTDL2 – HIENLTHHIENLTH, HCMUP

Node cha: đen

Node con: đỏ

Biến đổi cây 2-3-4 sang cây đỏ đen

• Biến đổi bất kỳ 4-node sang node cha P và cả hai node con C1, C2 màu đỏ.

9191CTDL2 – HIENLTHHIENLTH, HCMUP

Node cha: đen

Node con: đỏ

Câu hỏi và thảo luận

9292CTDL2 – HIENLTHHIENLTH, HCMUP