Upload
itnoi
View
209
Download
0
Embed Size (px)
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