92
Đại Hc Sư Phm Tp. HChí Minh Đại Hc Sư Phm Tp. HChí Minh CU TRÚC DLIU 2 CU TRÚC DLIU 2 Chương 04: CÂY ĐỎ ĐEN

CTDL2_CH04_CayDoDen

  • Upload
    itnoi

  • View
    209

  • Download
    0

Embed Size (px)

Citation preview

Page 1: CTDL2_CH04_CayDoDen

Đạ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

Page 2: CTDL2_CH04_CayDoDen

Ô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

Page 3: CTDL2_CH04_CayDoDen

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.

Page 4: CTDL2_CH04_CayDoDen

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.

Page 5: CTDL2_CH04_CayDoDen

Ví dụ:

55CTDL2 – HIENLTHHIENLTH, HCMUP

Page 6: CTDL2_CH04_CayDoDen

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 đỏ - đỏ.

Page 7: CTDL2_CH04_CayDoDen

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)

Page 8: CTDL2_CH04_CayDoDen

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)

Page 9: CTDL2_CH04_CayDoDen

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;};

Page 10: CTDL2_CH04_CayDoDen

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);

Page 11: CTDL2_CH04_CayDoDen

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):

}

Page 12: CTDL2_CH04_CayDoDen

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;

}

Page 13: CTDL2_CH04_CayDoDen

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)}

}

Page 14: CTDL2_CH04_CayDoDen

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)

Page 15: CTDL2_CH04_CayDoDen

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

Page 16: CTDL2_CH04_CayDoDen

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);

}

Page 17: CTDL2_CH04_CayDoDen

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

Page 18: CTDL2_CH04_CayDoDen

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

Page 19: CTDL2_CH04_CayDoDen

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

yy

γ

1919CTDL2 – HIENLTHHIENLTH, HCMUP

xx

α β

γ

Page 20: CTDL2_CH04_CayDoDen

Phép quay (như BST)

yy

γxx

Quay phải

2020CTDL2 – HIENLTHHIENLTH, HCMUP

γxx

α βyy

γα

β

Quay trái

Page 21: CTDL2_CH04_CayDoDen

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)

Page 22: CTDL2_CH04_CayDoDen

Trường hợp 1

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

2222CTDL2 – HIENLTHHIENLTH, HCMUP

Page 23: CTDL2_CH04_CayDoDen

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

Page 24: CTDL2_CH04_CayDoDen

X

P

G

U

G

X

2424CTDL2 – HIENLTHHIENLTH, HCMUP

X

P U

Case 2 – P, U is Red

Just Recolor and move up

Page 25: CTDL2_CH04_CayDoDen

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

Page 26: CTDL2_CH04_CayDoDen

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

Page 27: CTDL2_CH04_CayDoDen

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

Page 28: CTDL2_CH04_CayDoDen

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

Page 29: CTDL2_CH04_CayDoDen

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

β

Page 30: CTDL2_CH04_CayDoDen

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;

}

Page 31: CTDL2_CH04_CayDoDen

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

Page 32: CTDL2_CH04_CayDoDen

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

Page 33: CTDL2_CH04_CayDoDen

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

Page 34: CTDL2_CH04_CayDoDen

5050

25258080

3434CTDL2 – HIENLTHHIENLTH, HCMUP

7575100100

110110

105105

x

Page 35: CTDL2_CH04_CayDoDen

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

Page 36: CTDL2_CH04_CayDoDen

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;

}

Page 37: CTDL2_CH04_CayDoDen

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;}

Page 38: CTDL2_CH04_CayDoDen

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);}

Page 39: CTDL2_CH04_CayDoDen

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;

Page 40: CTDL2_CH04_CayDoDen

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)

Page 41: CTDL2_CH04_CayDoDen

Red-Black Trees

Insertion example

11

2 14

4141CTDL2 – HIENLTHHIENLTH, HCMUP

151 7

5 8

4 Case 1

Page 42: CTDL2_CH04_CayDoDen

Red-Black Trees

Insertion example

11

7 14

4242CTDL2 – HIENLTHHIENLTH, HCMUP

152 8

4

1 5

Case 2

Page 43: CTDL2_CH04_CayDoDen

Red-Black Trees

Insertion example

2

77

11

4343CTDL2 – HIENLTHHIENLTH, HCMUP

4

1 5 14

15

8

Case 3

Page 44: CTDL2_CH04_CayDoDen

4444CTDL2 – HIENLTHHIENLTH, HCMUP

Page 45: CTDL2_CH04_CayDoDen

4545CTDL2 – HIENLTHHIENLTH, HCMUP

Page 46: CTDL2_CH04_CayDoDen

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.

Page 47: CTDL2_CH04_CayDoDen

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

Page 48: CTDL2_CH04_CayDoDen

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

Page 49: CTDL2_CH04_CayDoDen

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ỳ

Page 50: CTDL2_CH04_CayDoDen

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;

}

Page 51: CTDL2_CH04_CayDoDen

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

Page 52: CTDL2_CH04_CayDoDen

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

Page 53: CTDL2_CH04_CayDoDen

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

Page 54: CTDL2_CH04_CayDoDen

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);

Page 55: CTDL2_CH04_CayDoDen

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;

Page 56: CTDL2_CH04_CayDoDen

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;

Page 57: CTDL2_CH04_CayDoDen

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;

Page 58: CTDL2_CH04_CayDoDen

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

Page 59: CTDL2_CH04_CayDoDen

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

Page 60: CTDL2_CH04_CayDoDen

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)

Page 61: CTDL2_CH04_CayDoDen

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 đỏ

Page 62: CTDL2_CH04_CayDoDen

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.

Page 63: CTDL2_CH04_CayDoDen

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

Page 64: CTDL2_CH04_CayDoDen

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

Page 65: CTDL2_CH04_CayDoDen

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

Page 66: CTDL2_CH04_CayDoDen

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

Page 67: CTDL2_CH04_CayDoDen

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

Page 68: CTDL2_CH04_CayDoDen

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.

Page 69: CTDL2_CH04_CayDoDen

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

Page 70: CTDL2_CH04_CayDoDen

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

Page 71: CTDL2_CH04_CayDoDen

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.

Page 72: CTDL2_CH04_CayDoDen

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

7272CTDL2 – HIENLTHHIENLTH, HCMUP

Page 73: CTDL2_CH04_CayDoDen

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

7373CTDL2 – HIENLTHHIENLTH, HCMUP

2 - 3 - 4 tree

Page 74: CTDL2_CH04_CayDoDen

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

7474CTDL2 – HIENLTHHIENLTH, HCMUP

Page 75: CTDL2_CH04_CayDoDen

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];

};

Page 76: CTDL2_CH04_CayDoDen

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).

Page 77: CTDL2_CH04_CayDoDen

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)

Page 78: CTDL2_CH04_CayDoDen

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

Page 79: CTDL2_CH04_CayDoDen

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.

Page 80: CTDL2_CH04_CayDoDen

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

8080CTDL2 – HIENLTHHIENLTH, HCMUP

Page 81: CTDL2_CH04_CayDoDen

Ví dụ Tách nút

8181CTDL2 – HIENLTHHIENLTH, HCMUP

Page 82: CTDL2_CH04_CayDoDen

Ví dụ Tách nút

8282CTDL2 – HIENLTHHIENLTH, HCMUP

Page 83: CTDL2_CH04_CayDoDen

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

8383CTDL2 – HIENLTHHIENLTH, HCMUP

Page 84: CTDL2_CH04_CayDoDen

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

Page 85: CTDL2_CH04_CayDoDen

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

Page 86: CTDL2_CH04_CayDoDen

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

Page 87: CTDL2_CH04_CayDoDen

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.

Page 88: CTDL2_CH04_CayDoDen

Đá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))

Page 89: CTDL2_CH04_CayDoDen

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

Page 90: CTDL2_CH04_CayDoDen

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: đỏ

Page 91: CTDL2_CH04_CayDoDen

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: đỏ

Page 92: CTDL2_CH04_CayDoDen

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

9292CTDL2 – HIENLTHHIENLTH, HCMUP