Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 4: Cây và các bài toán trên cây - Võ Minh Phổ
C¸c bµi gi¶ng CÊu tróc d÷ liÖu vµ Gi¶i thuËt
CH¦¥NG 4. C©y vµ c¸c bµi to¸n trªn c©y.
$1. Mét sè kh¸i niÖm vÒ c©y.
1.1. C©y vµ bËc cña c©y.
a. §inh nghÜa. C©y lµ mét tËp hîp T rçng hoÆc gåm nhiÒu phÇn tö gäi lµ nót
(node), trong ®ã:
- Mét nót ®-îc gäi lµ nót gèc (root)
- C¸c nót cßn l¹i ph©n chia thµnh m nhãm(m>=0), mçi
nhãm lµ mét c©y vµ ®-îc gäi lµ c©y con (subtree).
Nót lµ mét phÇn tö cña danh s¸ch vµ cã thÓ cã kiÓu bÊt k×. C¸c nót ®-îc biÓu
diÔn bëi mét kÝ tù ch÷, mét chuçi, mét sè ghi trong mét vßng trßn. C©y kh«ng
cã nót nµo c¶ gäi lµ c©y rçng (nulltree)
b. BËc cña nót vµ bËc cña c©y(degree). BËc cña nót lµ sè c©y con cña nót ®ã.
BËc cña c©y lµ bËc lín nhÊt cña c¸c nót cña c©y. NÕu c©y cã bËc n th× ta gäi c©y
n-ph©n.
VÝ dô. Víi c©y
A
B
D
C
G
E
F
H
K
L
BËc cña nót A lµ 3, cña nót B lµ 0, cña nót D lµ 2
BËc cña c©y lµ 3 -> C©y tam ph©n.
c. Nót kÕt thóc vµ nót trung gian.
Nót kÕt thóc ( hoÆc nót l¸ - leaf) lµ nót cã bËc b»ng 0.
Nót trung gian (interior node) lµ nót cã bËc kh¸c 0 vµ kh«ng ph¶i nót gèc.
73
Vâ Minh Phæ – Bé m«n KHMT - HVKTQS
C¸c bµi gi¶ng CÊu tróc d÷ liÖu vµ Gi¶i thuËt
VÝ dô : C¸c nót l¸ lµ B,G,H,K,L,F
C¸c nót trung gian lµ C,E,D
1.2. Møc cña nót (level)vµ chiÒu cao cña c©y(depth, height):
a. Møc cña nót.
- Møc cña gèc b»ng 1
- Møc cña nót kh¸c gèc b»ng møc cña nót gèc cña c©y con nhá nhÊt chøa nã
céng víi 1.
ChiÒu cao cña c©y lµ møc lín nhÊt cña nót l¸.
VÝ dô :
C¸c nót B,C,D co møc 2
C¸c nót G,E,F cã møc lµ 3
ChiÒu cao cña c©y lµ 4
b. Nót tr-íc vµ nót sau.
Nót y ®-îc gäi lµ nót tr-íc cña nót x nÕu c©y con cã gèc lµ y chøa x, vµ khi ®ã
nót x gäi lµ nót sau cña nót y.
VÝ dô.
Nót D lµ nót tr-íc cña nót H vµ nót H lµ nót sau cña nót D.
c. Nót cha (ancestor) vµ nót con (descendant).
NÕu y lµ nót tr-íc cña nót x vµ møc cña x b»ng møc cña nót y c«ng 1, th× y
®-îc gäi lµ nót cha cña nót x vµ nót x ®-îc gäi lµ nót con cña nót y.
VÝ dô.
Nót E lµ nót cha cña nót H vµ nót H lµ nót con cña nót E.
Nót D kh«ng ph¶i lµ nót cha cña nót H
1.3. C©y cã thø tù(ordered tree) vµ rõng.
a. C©y cã thø tù. Mét c©y ®-îc gäi lµ cã thø tù nÕu ta thay ®æi vÞ trÝ cña c¸c
c©y con th× sÏ cã mét c©y míi.
VÝ dô.
74
Vâ Minh Phæ – Bé m«n KHMT - HVKTQS
C¸c bµi gi¶ng CÊu tróc d÷ liÖu vµ Gi¶i thuËt
A
A
B
E
B
E
C
D
D
C
b. Rõng (forest).
NÕu cã mét tËp h÷u h¹n c¸c c©y ph©n biÖt th× ta gäi ®ã lµ rõng. Nh- vËy nÕu
mét c©y bÞ lo¹i bá nót gèc cã thÓ cho ta mét rõng.
1.4. Ph-¬ng ph¸p biÓu diÔn c©y.
Cã thÓ biÓu diÔn c©y b»ng nhiÒu ph-¬ng ph¸p ë ®ay ta chØ h¹n chÕ trong mét
sè ph-¬ng ph¸p c¬ b¶n sau:
a. BiÓu diÔn c©y b»ng ®å thÞ.
- Mçi nót lµ mét ®Ønh
- C¹nh øng víi 2 nót ®-îc nèi thµnh ®o¹n th¼ng.
b. BiÓu diÔn c©y b»ng gi¶n ®å.
c. C¸ch chøa c©y trong bé nhí.
Ta cã thÓ chøa c©y trong bé nhí b»ng c¸ch sö dông danh s¸ch liªn kÕt, mçi
®Ønh t-¬ng øng víi mét nót.
- ¸p dông cho c©y nhÞ ph©n:
Mét nót gåm cã:
Left INFO right
Tr-êng INFO øng víi th«ng tin (d÷ liÖu) cña nót
- Tr-êng left øng víi con trá, trá tíi c©y con tr¸i cña nót ®ã.
- Tr-êng right øng víi con trá, trá tíi c©y con ph¶i cña nót ®ã.
VÝ dô c©y nhÞ ph©n ta biÓu diÔn b»ng danh s¸ch liªn kÕt nh- sau:
75
Vâ Minh Phæ – Bé m«n KHMT - HVKTQS
C¸c bµi gi¶ng CÊu tróc d÷ liÖu vµ Gi¶i thuËt
A
C
D
L
E
F
G
H
Root
Trong ®ã ký hiÖu x ë c¸c liªn kÕt lªn r»ng liªn kÕt chØ ra nil
- ¸p dông c©y n- ph©n , ta cã thÓ sö dông liªn kÕt sau
info Link1 Link2
Linkn
…
Ph-¬ng ph¸p m« t¶ vµ chøa c©y n- ph©n b»ng danh s¸ch liªn kÕt chØ cã lîi khi
hÇu hÕt c¸c nót cña c©y cã bËc n, tøc lµ c¸c vïng liªn kÕt cña c¸c nót ®Òu ®-îc
sö dông. Nh-ng nÕu trong c©y cã nhiÒu nót cã bËc nhá h¬n n th× khi ®ã ta sÏ
l·ng phÝ bé nhí v× cã nhiÒu vïng liªn kÕt kh«ng ®-îc sö dông.
Ta còng cã thÓ m« t¶ vµ chøa c©y n- ph©n b»ng c¸ch dïng c©y nhÞ ph©n vµ
chøa trong bé nhí. ViÖc m« t¶ theo quy -íc:
- C¸c cã cïng nót cha (c¸c nót anh em ) sÏ ë trªn cïng ®-êng ngang.
- C¸c nót con ë ®-êng phÝa d-íi.
Khi ®ã ®èi víi mét nót th× liªn kÕt tr¸i chØ ®Õn mét nót con (mòi tªn th¼ng
®øng) vµ liªn kÕt ph¶i chØ ®Õn mét nót anh em cã cïng nót cha(mòi tªn ngang).
76
Vâ Minh Phæ – Bé m«n KHMT - HVKTQS
C¸c bµi gi¶ng CÊu tróc d÷ liÖu vµ Gi¶i thuËt
A
B
C
G
D
E
F
H
K
L
C©y nhÞ ph©n lµ c©y c¬ b¶n vµ ®-îc øng dông nhiÒu, khai b¸o c©y nhÞ ph©n nh-
sau:
d. Tæ chøc c©y. Ta khai b¸o
Type
Infor = integer;
Ref = ^node;
Node = record
Info: infor ;(*néi dung cña nót*)
Left, right: ref;
End;
Var
Root: ref;
d. Khëi t¹o c©y (c©y rçng).
Procedure InnitializeT;
Begin
Root:=nil;
End;
1.4. C¸c phÐp duyÖt c©y.
a. DuyÖt tiÒn thø tù (NLR, NRL)
- NÕu c©y chØ cã nót gèc, duyÖt gèc lµ duyÖt tiÒn thø tù.
- Gäi r lµ gèc T1,T2,…,Tk lµ c¸c c©y con øng víi gèc theo thø tù tõ tr¸i sang
ph¶I (ph¶i sang tr¸i). Khi ®ã duyÖt tiÒn thø tù lµ c¸ch duyÖt sau:
77
Vâ Minh Phæ – Bé m«n KHMT - HVKTQS
C¸c bµi gi¶ng CÊu tróc d÷ liÖu vµ Gi¶i thuËt
+ DuyÖt gèc r
+ DuyÖt T1 theo tiÒn thø tù
+ DuyÖt T2 theo tiÒn thø tù
…
+ DuyÖt Tk theo tiÒn thø tù
A
B
H
C
K
F
L
D
E
ABCDEFHKL lµ duyÖt tiÒn thø tù NLR
AHLKBDFEC lµ duyÖt tiÒn thø tù NRL
b. DuyÖt trung thø tù (LNR, RNL)
- NÕu c©y chØ cã gèc th× duyÖt gèc theo trung thø tù.
- Gäi r lµ gèc T1,T2,…,Tk lµ c¸c c©y con øng víi gèc theo thø tù tõ tr¸i sang
ph¶i (ph¶i sang tr¸i). Khi ®ã duyÖt trung thø tù lµ c¸ch duyÖt sau:
+ DuyÖt T1 theo trung thø thù
+ DuyÖt gèc r
+ DuyÖt T2, T3,…, Tk theo trung thø tù
CBEDFAKHL lµ duyÖt trung thø tù LNR
LHKAFDEBC lµ duyÖt trung thø tù RNL
c. DuyÖt hËu thø tù (LRN, RLN).
- NÕu c©y chØ cã gèc lµ r th× duyÖt r lµ duyÖt hËu thø tù
- Gäi r lµ gèc T1,T2,…,Tk lµ c¸c c©y con øng víi gèc theo thø tù tõ tr¸i sang
ph¶i (ph¶i sang tr¸i). Khi ®ã duyÖt hËu thø tù lµ c¸ch duyÖt sau:
+ DuyÖt T1 theo hËu thø tù
78
Vâ Minh Phæ – Bé m«n KHMT - HVKTQS
C¸c bµi gi¶ng CÊu tróc d÷ liÖu vµ Gi¶i thuËt
+ DuyÖt T2 theo hËu thø tù
…
+ DuyÖt Tk theo hËu thø tù
+ Cuèi cïng duyÖt r.
CEFDBKLHA lµ duyÖt hËu thø tù LRN
LKHFEDCBA lµ duyÖt hËu thø tù RLN
$2. DuyÖt c©y nhÞ ph©n theo thø tù NLR
2.1. Dïng ph-¬ng ph¸p ®Ö quy vµ dïng Stack.
a. Dïng ®Ö quy.
Procedure Traverse_NLR (p: ref);
Begin
If p <>nil then
Begin
Writeln (p^.info);
Traverse_NLR (p^.left);
Traverse_NLR (p^.right);
End;
End;
Gäi thñ tôc lµ:
Traverse_NLR(root);
b. Dïng stack
Khi ®i theo nh¸nh tr¸i, ta l-u gi÷ c¸c nót con bªn ph¶i vµo stack ®Ó sau cã thÓ
trë l¹i nót nµy.
Thªm biÕn :
+ stack: array [1.. stackno] of ref;
+ cont kiÓu boolean cho gi¸ trÞ false khi stack rçng.
Procedure traverse_NLR;
Var
Cont: boolean;
79
Vâ Minh Phæ – Bé m«n KHMT - HVKTQS
C¸c bµi gi¶ng CÊu tróc d÷ liÖu vµ Gi¶i thuËt
P : ref;
Stack : array[1.. stackno]of ref;
Sp : 0.. stackno;
Begin
P := root;
Sp := 0;
Cont := true;
While p<>nil and cont do
Begin
Writeln(p^.info);
If P^.right<>nil then
Begin
Sp:= sp+1;
Stack[sp]:= p^.right;
End;
If p^left<>nil then
P:= p^.left
else
if sp =0 then
cont:= false;
else
begin
p:= stack[sp];
sp:= sp -1;
end;
end;
end;
c. Ph-¬ng ph¸p ®æi ng-îc vïng liªn kÕt.
80
Vâ Minh Phæ – Bé m«n KHMT - HVKTQS
C¸c bµi gi¶ng CÊu tróc d÷ liÖu vµ Gi¶i thuËt
C¸ch nµy kh«ng th«ng dông v× cÊu tróc c©y sÏ bÞ ph¸ huû hoµn toµn sau khi
duyÖt xong do khi ®i xuèng nót con ta ®æi ng-îc vïng liªn kÕt chØ lªn nót cha
®Ó trë vÒ ®-îc dÔ dµng.
2.2. C©y liªn kÕt vßng
a. C©y liªn kÕt vßng.
- Khi tæ chøc c©y lµ mét danh s¸ch liªn kÕt, cã nh÷ng nót vïng liªn kÕt chØ vµo
nil. Ta cho c¸c vïng liªn kÕt nµy chØ ®Õn nh÷ng nót ®øng sau nã theo phÐp
duyÖt nh»m lµm cho phÐp duyÖt dÔ dµng vµ nhanh h¬n. C©y cã cÊu tróc nµy gäi
lµ c©y liªn kÕt vßng
- Sö dông thªm c¸c liªn kÕt gi¶ gäi lµ liªn kÕt vßng, chØ ®Õn nót ®øng sau theo
phÐp duyÖt, ta g¸n mét gi¸ trÞ ©m cho vïng liªn kÕt gi¶.
- Ta kÝ hiÖu:
*p – nót tr-íc nót p theo phÐp duyÖt
p* - nót sau nót p theo phÐp duyÖt
*(p*) = p
- Ta tæ chøc c©y liªn kÕt vßng theo quy t¾c sau:
+ NÕu vïng liªn kÕt left lµ nil th× vïng nµy sÏ chØ vµo nót ®øng tr-íc
nã theo phÐp duyÖt.
+ NÕu vïng liªn kÕt right lµ nil th× vïng nµy sÏ chØ vµo nót ®øng sau
theo phÐp duyÖt, do ®ã c©y liªn kÕt vßng ®-îc t¹o tõ c©y kh«ng liªn kÕt vßng
theo quy t¾c sau:
C©y kh«ng liªn kÕt vßng:
P^.left = q
P^.right =q
C©y liªn kÕt vßng
P^.left = q
P^.right = q
P^.left =nil
P^.right =nil
P^left = -(*p)
P^.right = -(p*)
81
Vâ Minh Phæ – Bé m«n KHMT - HVKTQS
C¸c bµi gi¶ng CÊu tróc d÷ liÖu vµ Gi¶i thuËt
head
root
A
B
H
D
C
K
L
E
F
- Mét nót cña c©y liªn kÕt vßng ph¶i cã thªm hai vïng Ltype cña liªn kÕt tr¸i
vµ Rtype cña liªn kÕt ph¶i ®Ó ph©n biÖt liªn kÕt thËt hay liªn kÕt gi¶.
b. Khai b¸o c©y liªn kÕt vßng.
Type
Infor = integer;
Ref = ^node;
Node=record
Info : infor;
Left, Right : ref;
Ltype, Rtype : boolean;
End;
- NÕu Ltype (Rtype) cã gi¸ trÞ true th× liªn kÕt left(right) lµ liªn kÕt thËt.
- NÕu Ltype(Rtype) cã gi¸ trÞ false th× liªn kÕt left(right) lµ liªn kÕt gi¶.
2.3. C¸c phÐp to¸n trªn c©y liªn kÕt vßng NLR:
a. T¹o c©y liªn kÕt vßng NLR tõ c©y kh«ng liªn kÕt vßng:
T¹i nót p cña c©y nÕu:
82
Vâ Minh Phæ – Bé m«n KHMT - HVKTQS
C¸c bµi gi¶ng CÊu tróc d÷ liÖu vµ Gi¶i thuËt
+P^.left = nil ta cho liªn kÕt gi¶ chØ ®Õn nót ®øng tr-íc theo phÐp
duyÖt.
+P^.right = nil ta cho liªn kÕt gi¶ chØ ®Õn nót ®øng sau theo phÐp duyÖt.
Sau khi t¹o c©y liªn kÕt vßng ta b¾t ®Çu duyÖt head (lµ nót mµ liªn kÕt tr¸i chØ
vµo gèc, liªn kÕt ph¶i chØ vµo chÝnh nã ). Trong gi¶i thuËt d-íi ®©y tr-íc tiªn ta
ph¶i ®-a head vµo Stack ®Ó cho vïng liªn kÕt right cña nót cuèi cïng theo phÐp
duyÖt chØ ®Õn head. Khai b¸o bæ sung thªm biÕn head
Var
Head : ref;
Gäi q lµ nót ®øng tr-íc nót p theo phÐp duyÖt(NLR). L-u ý c¸c tr-êng hîp:
TH1. Nót p kh«ng cã nót con bªn tr¸i. Ta cho liªn kÕt gi¶ left cña nót p
chØ ®Õn nót q
q
q
1
p
p
TH2. Nót p lµ nót l¸. Ta cho liªn kÕt gi¶ right cña nót p chØ ®Õn nót p*
(nót x)
q
q
p
x
p
X
TH3. Nót p cã nót con bªn tr¸i vµ kh«ng cã nót con bªn ph¶i. Cho liªn
kÕt gi¶ right cña nót p chØ ®Õn nót con bªn tr¸i cña nót p
p
p
83
Vâ Minh Phæ – Bé m«n KHMT - HVKTQS
C¸c bµi gi¶ng CÊu tróc d÷ liÖu vµ Gi¶i thuËt
3
TH4. NÕu c©y rçng ta cho liªn kÕt gi¶ left cña head chØ ®Õn hed
Gäi q lµ nót ®øng tr-íc p, x lµ nót ®øng sau p theo phÐp duyÖt. Gi¶i thuËt ®-îc
m« t¶ nh- sau:
Procedure Intialize_NLR
Var
Sp: 0.. stackno; { Stack pointer}
Stack:= array[1..stackno] of ref;
p, q, x: ref;
Begin
New(head)
p:= root;
Head^.right:=head;Head^.Rtype:= false; {5}
q:=head;
if p>nil then {c©y kh¸c rçng}
begin
head^.left:= root;
head^.Ltype:= true;{®-a head vµo stack}
sp:= 1;
stack[sp]:= head;
repeat
if p^.left = nil then
begin{p kh«ng cã nót con tr¸i}
p^.left := q;
p^.Ltype:= false; {1}
q:= p;
84
Vâ Minh Phæ – Bé m«n KHMT - HVKTQS
C¸c bµi gi¶ng CÊu tróc d÷ liÖu vµ Gi¶i thuËt
if p^.right = nil then{p lµ nót l¸}
{LÊy ra tõ stack}
begin
x:= stack[sp];
sp:= sp-1;
p^right:= x; {2}
p^Rtype:= false;
p:=x;
end
else {®Õn nót con bªn ph¶I cña p}
begin
p^.rtype:= true;
p:= p^.right;
end;
end
else
begin {p cã nót con bªn tr¸i }
p^.ltype:= true;
q:= p;
if p^.right = nil then
begin
{p kh«ng cã nót con bªn ph¶i }
p^.right:= p^.left;
p^.Rtype:= false; {3}
end
else
begin
{p cã nót con bªn ph¶I, ®-a nót con
vµo Stack }
85
Vâ Minh Phæ – Bé m«n KHMT - HVKTQS
C¸c bµi gi¶ng CÊu tróc d÷ liÖu vµ Gi¶i thuËt
p^.Rtype:= true;
sp:= sp + 1;
stack[sp]:= p^.right;
end;
p:= p^.left; {®Õn nót con bªn tr¸i }
end;
until p = head;
end
else
begin {c©y rçng}
head^..left:= head;
head^.Ltype:= false;{4}
end;
end;
86
Vâ Minh Phæ – Bé m«n KHMT - HVKTQS
C¸c bµi gi¶ng CÊu tróc d÷ liÖu vµ Gi¶i thuËt
SB
1
Q
P
P^.L P^.R P^.L:= P^.R:= P^.LT:= P^.RT:= Q:= P:= STACK
Head
head
A
A
B
C
D
E
F
B
H
true
true
A
B
C
D
E
F
B
C
D
E
F
H,head
D,H,head
H,head
F,H,head
H,head
Head
2
3
4
5
6
7
8
9
A
B
C
D
E
F
C
D
True
False
true
true
Nil
E
Nil
F
B
D
false
true
E
D
E
K
H
K
F
Nil
Nil
K
nil
nil
L
F
false
false
true
false
false
true
H
H
K
L
H
K
L
L
H
K
L,head
H
K
Nil
Nil
nil
nil
L
false
false
false
false
Head
head
Stack Rçng
b. DuyÖt c©y liªn kÕt vßng NLR: Ta cã nhËn xÐt sau:
- Trong c©y liªn kÕt vßng NLR, liªn kÕt ph¶i right (thËt hay gi¶) cña mét nót
bao giê còng chØ ®Õn nót ®øng sau nã theo phÐp duyÖt. Do ®ã ta cã gi¶i thuËt
duyÖt NLR nh- sau:
+ NÕu nót p cã nót con bªn tr¸i (liªn kÕt tr¸i left lµ thËt) th× ta ®i ®Õn nót con.
+ NÕu nót p kh«ng con bªn tr¸i th× ta ®i ®Õn nót p* (liªn kÕt right lµ thËt hay
gi¶).
- Gi¶i thuËt:
Procedure traverse_LNR;
Var
P : ref;
Begin
P:= head^.left;
While p<> head do
Begin
Write(p^.info);
If p^.Ltype then { liªn kÕt left th©t-®Õn nót con bªn tr¸I
nót p}
P:= p^.left
Else { liªn kÕt right thËt hay gi¶- ®Õn nót p*}
P:= p^.right;
End;
87
Vâ Minh Phæ – Bé m«n KHMT - HVKTQS
C¸c bµi gi¶ng CÊu tróc d÷ liÖu vµ Gi¶i thuËt
End;
c. T¹o c©y liªn kÕt vßng NLR
Khi t¹o c©y kiªn kÕt vßng NLR cho liªn kÕt gi¶ right, left cña head chØ ®Õn
head.
procedure initialize_NLR;
begin
new(head);
with head^ do
begin
left:= head;
Ltype:= false;
Right:= head;
Rtype:= false;
End;
End;
d. Thªm mét nót vµo c©y liªn kÕt vßng NLR:
d1. Thªm mét nót vµo bªn tr¸i nót q.
- Gäi p lµ nót cÇn thªm vµo c©y. XÐt c¸c tr-êng hîp:
1/. Nót q cã nót con bªn tr¸i.
Gäi q1 lµ nót con bªn tr¸i cña nót q (q1:= q^.left). Ta cho:
+ Liªn kÕt thËt left cña nót p chØ ®Õn nót q1 {1}
p^.left:=q1; p^.Ltype:=true;
+ Liªn kÕt gi¶ right cña nót p chØ ®Õn nót q1 {2}
p^.left:=q1; p^.Rtype:=false;
+ Liªn kÕt thËt left cña nót q chØ ®Õn nót p {3}
q^.left:=p; q^.ltype:=true;
q
q
3
p
q1
88
Vâ Minh PBé m«n KHMT - HVKTQS
q1
C¸c bµi gi¶ng CÊu tróc d÷ liÖu vµ Gi¶i thuËt
1
2
C¸c tr-êng hîp cã thÓ:
+ TH1: Nót q kh«ng cã nót con bªn ph¶i.
Ta cho liªn kÕt gi¶ right cña nót q chØ ®Õn nót p {4}.
q^.right:=p; q^.Rtype: false
q
q
4
p
q1
q1
+ TH2. Nót q1 kh«ng cã nót con bªn tr¸i.
Ta cho liªn kÕt gi¶ left cña nót q1 chØ ®Õn nót p {5}.
q1^.left:=p; q1^.Ltype:=false;
q
q
p
q1
5
q1
+ Gi¶i thuËt:
Procedure Insert_left_NLR(q: ref; Newinfo: infor );
Var
p, q1: ref;
Begin
New(p);
q1: = q^.left;
89
Vâ Minh Phæ – Bé m«n KHMT - HVKTQS
C¸c bµi gi¶ng CÊu tróc d÷ liÖu vµ Gi¶i thuËt
with p^ do
begin
info:= newinfo;
left:= q1; Ltype:= true;
right:=q1; Rtype:= false; {2}
end;
q^.left:= p;
{1}
{3}
if not q^.Rtype then q^.right:= p; {4}
if not q1^.Ltype then q1^.left:= p; {5}
end;
2/. Nót q kh«ng cã nót con bªn tr¸i.
+ Cho liªn kÕt thËt left cña nót q chØ ®Õn nót p{6}
q^.left:=p; q^.Ltype:=true;
q
q
7
6
p
+ Liªn kÕt gi¶ left cña nót p chØ ®Õn nót q{7}
p^.left:=q; p^.Ltype:=false;
+ Liªn kÕt gi¶ right cña nót p chØ ®Õn nót q*{8}
p^.right:=q*; p^.Rtype:=false;
q
q
p
8
90
Vâ Minh Phæ – Bé m«n KHMT - HVKTQS
C¸c bµi gi¶ng CÊu tróc d÷ liÖu vµ Gi¶i thuËt
C¸c tr-êng hîp x¶y ra lµ :
TH1. Nót q kh«ng cã nót con bªn ph¶i.
- Cho liªn kÕt gi¶ right cña nót q chØ ®Õn nót p {9}.
q^.right:=p; q^.Rtype:=false;
q
q
9
p
q*
8
q*
TH2. Nót q* kh«ng cã nót con bªn tr¸i.
- Cho liªn kÕt gi¶ left cña nót q* chØ ®Õn nót p{10}.
q*^.left:=p; q*^.Ltype:=false;
q
q
q*
q*
p
10
Gi¶i thuËt:
Procedure Insert_left_NLR2(q: ref; Newwinfo: Infor);
Var
P, q1: ref;
Begin
New(p);
q^.left:= p; q^.Ltype:= true;
with p^ do
{6}
begin
info:= Newinfor;
left:= q; Ltype:= false;
right:= q^.right; Rtype:= false;
end;
{7}
{8}
91
Vâ Minh Phæ – Bé m«n KHMT - HVKTQS
C¸c bµi gi¶ng CÊu tróc d÷ liÖu vµ Gi¶i thuËt
q1:= p^.right;
if not q^.Rtype then q^.Right:= p;
if not q1^.Ltype then q1^.left:= p;
end;
{9}
{10}
Ta cã thÓ viÕt l¹i mét c¸ch ®Çy ®ñ tÊt c¶ c¸c tr-êng hîp nh- sau:
Procedure Insert_left_NLR(q: ref; Newwinfo: Infor);
Var
P,q1: ref;
Begin
New(p);
P^.info:=Newinfo;
If q^.Ltype then {q cã nót con tr¸i}
Begin
q1:=q^.left;
with p^ do
begin
left:= q1; Ltype:= true;
right:= q1; Rtype:= false;
{1}
{2}
end;
if not q1^.Ltype then q1.^left:=p;
end
{5}
else
begin { q kh«ng cã nót con bªn tr¸i}
with p^ do
begin
left:= q; Ltype:= false;
right:= q^.right; Rtype:= false;
end;
{7}
{8}
q1:=p^.Right;
92
Vâ Minh Phæ – Bé m«n KHMT - HVKTQS
Tải về để xem bản đầy đủ
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 4: Cây và các bài toán trên cây - Võ Minh Phổ", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
File đính kèm:
bai_giang_cau_truc_du_lieu_va_giai_thuat_chuong_4_cay_va_cac.doc

