Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 4: Cây

Ch-¬ng 4  
c © y  
Trong ch-¬ng nµy chóng ta sÏ nghiªn cøu m« h×nh d÷ liÖu c©y. C©y lµ  
mét cÊu tróc ph©n cÊp trªn mét tËp hîp nµo ®ã c¸c ®èi t-îng. Mét vÝ dô quen  
thuéc vÒ c©y, ®ã lµ c©y th- môc. C©y ®-îc sö dông réng r·i trong rÊt nhiÒu  
vÊn ®Ò kh¸c nhau. Ch¼ng h¹n, nã ®-îc ¸p dông ®Ó tæ chøc th«ng tin trong c¸c  
hÖ c¬ së d÷ liÖu, ®Ó m« t¶ cÊu tróc có ph¸p cña c¸c ch-¬ng tr×nh nguån khi  
x©y dùng c¸c ch-¬ng tr×nh dÞch. RÊt nhiÒu c¸c bµi to¸n mµ ta gÆp trong c¸c  
lÜnh vùc kh¸c nhau ®-îc quy vÒ viÖc thùc hiÖn c¸c phÐp to¸n trªn c©y. Trong  
ch-¬ng nµy chóng ta sÏ tr×nh bµy ®Þnh nghÜa vµ c¸c kh¸i niÖm c¬ b¶n vÒ c©y.  
Chóng ta còng sÏ xÐt c¸c ph-¬ng ph¸p cµi ®Æt c©y vµ sù thùc hiÖn c¸c phÐp  
to¸n c¬ b¶n trªn c©y. Sau ®ã chóng ta sÏ nghiªn cøu kü mét d¹ng c©y ®Æc  
biÖt, ®ã lµ c©y t×m kiÕm nhÞ ph©n.  
4.1. C©y vµ c¸c kh¸i niÖm vÒ c©y  
H×nh 4.1 minh ho¹ mét c©y T. §ã lµ mét tËp hîp T gåm 11 phÇn tö,  
T={a, b, c, d, e, f, g, h, i, j, k}. C¸c phÇn tö cña T ®-îc gäi lµ c¸c ®Ønh cña c©y  
T. TËp T cã cÊu tróc nh- sau. C¸c ®Ønh cña T ®-îc ph©n thµnh c¸c líp kh«ng  
c¾t nhau : líp thø nhÊt gåm mét ®Ønh duy nhÊt a, ®Ønh nµy gäi lµ gèc cña c©y;  
líp thø hai gåm c¸c ®Ønh b, c ; líp thø ba gåm c¸c ®Ønh d, e, f, g, h vµ líp  
cuèi cïng gåm c¸c ®Ønh i, j, k, mçi ®Ønh thuéc mét líp (trõ gèc), cã mét cung  
duy nhÊt nèi víi mét ®Ønh nµo ®ã thuéc líp kÒ trªn. (Cung nµy biÓu diÔn mèi  
quan hÖ nµo ®ã).  
a
b
c
d
e
f
g
k
h
i
j
H×nh 4.1 BiÓu diÔn h×nh häc mét c©y  
0
Trong to¸n häc cã nhiÒu c¸ch ®Þnh nghÜa c©y. ë ®©y chóng ta ®-a ra  
®Þnh nghÜa ®Ö quy vÒ c©y. §Þnh nghÜa nµy cho phÐp ta xuÊt ph¸t tõ c¸c c©y  
®¬n gi¶n nhÊt ( c©y chØ cã mét ®Ønh) x©y dùng nªn c¸c c©y lín h¬n.  
C©y (c©y cã gèc) ®-îc x¸c ®Þnh ®Ö quy nh- sau.  
1. TËp hîp gåm mét ®Ønh lµ c©y. C©y nµy cã gèc lµ ®Ønh duy nhÊt cña  
nã.  
2. Gi¶ sö T1, T2, ... , Tk (k 1) lµ c¸c c©y cã gèc t-¬ng øng lµ r1,r2...,rk.  
C¸c c©y Ti (i = 1, 2,...k) , kh«ng kh«ng c¾t nhau tøc lµ Ti Tj = víi i j.  
Gi¶ sö r lµ mét ®Ønh míi kh«ng thuéc c¸c c©y Ti (i = 1, 2,... , k). Khi ®ã, tËp  
hîp T gåm ®Ønh r vµ tÊt c¶ c¸c ®Ønh cña c©y Ti (i = 1, 2, ... , k) lËp thµnh mét  
c©y míi víi gèc r. C¸c c©y Ti (i = 1, 2, ... , k) ®-îc gäi lµ c©y con cña gèc r.  
Trong biÓu diÔn h×nh häc cña c©y T, mçi ®Ønh ri (i =1, 2, ... ,k) cã cung nèi  
víi gèc r (xem h×nh 4.2)  
r
r1  
r2  
rk  
T1  
T2  
Tk  
H×nh 4.2 C©y cã gèc r vµ c¸c c©y con cña gèc T1, T2, ... , Tk.  
Cha, con, ®-êng ®i.  
Tõ ®Þnh nghÜa c©y ta suy ra r»ng, mçi ®Ønh cña c©y lµ gèc cña c¸c c©y  
con cña nã. Sè c¸c c©y con cña mét ®Ønh gäi lµ bËc cña ®Ønh ®ã. C¸c ®Ønh cã  
bËc kh«ng ®-îc gäi lµ l¸ cña c©y.  
NÕu ®Ønh b lµ gèc cña mét c©y con cña ®Ønh a th× ta nãi ®Ønh b lµ con  
cña ®Ønh a vµ a lµ cha cña b. Nh- vËy, bËc cña mét ®Ønh lµ sè c¸c ®Ønh con  
cña nã, cßn l¸ lµ ®Ønh kh«ng cã con. C¸c ®Ønh cã Ýt nhÊt mét con ®-îc gäi lµ  
®Ønh trong. C¸c ®Ønh cña c©y hoÆc lµ l¸ hoÆc lµ ®Ønh trong.  
C¸c ®Ønh cã cïng mét cha ®-îc gäi lµ anh em. Mét d·y c¸c ®Ønh a1, a2,  
... an (n 1), sao cho ai (i = 1, 2, ... , n-1) lµ cha cña ai+1 ®-îc gäi lµ ®-êng ®i  
tõ a1 ®Õn an. §é dµi cña ®-êng ®i nµy lµ n-1. Ta cã nhËn xÐt r»ng, lu«n lu«n  
tån t¹i mét ®-êng ®i duy nhÊt tõ gèc tíi mét ®Ønh bÊt kú trong c©y.  
1
NÕu cã mét ®-êng ®i tõ ®Ønh a ®Õn ®Ønh b cã ®é dµi k 1, th× ta nãi a lµ  
tiÒn th©n cña b vµ b lµ hËu thÕ cña a.  
VÝ dô. Trong c©y ë h×nh 4.1, ®Ønh c lµ cha cña ®Ønh f, g, h. C¸c ®Ønh d,  
i, j, k vµ h lµ l¸, c¸c ®Ønh cßn l¹i lµ ®Ønh trong. a, c, g, k lµ ®-êng ®i cã ®é dµi  
3 tõ a ®Õn k. §Ønh b lµ tiÒn th©n cña c¸c ®Ønh d, e, i, j.  
C©y con.  
Tõ ®Þnh nghÜa c©y ta cã, mçi ®Ønh a bÊt kú cña c©y T lµ gèc cña mét  
c©y nµo ®ã, ta gäi c©y nµy lµ c©y con cña c©y T. Nã gåm ®Ønh a vµ tÊt c¶ c¸c  
®Ønh lµ hËu thÕ cña a. Ch¼ng h¹n, víi c©y T trong h×nh 4.1, T1 = {c, f, g, h, k}  
lµ mét c©y con  
§é cao, møc.  
Trong mét c©y, ®é cao cña mét ®Ønh a lµ ®é dµi cña ®-êng ®i dµi nhÊt  
tõ a ®Õn mét l¸. §é cao cña gèc ®-îc gäi lµ ®é cao cña c©y. Møc cña ®Ønh a lµ  
®é dµi cña ®-êng ®i tõ gèc ®Õn a. Nh- vËy gèc cã møc 0.  
VÝ dô. Trong c©y ë h×nh 4.1, ®Ønh b cã dé cao lµ 2, c©y cã ®é cao lµ 3.  
C¸c ®Ønh b, c cã møc 1 ; c¸c ®Ønh d, e, f, g, h cã møc 2, cßn møc cña c¸c ®Ønh  
i, j, k lµ 3.  
C©y ®-îc s¾p.  
Trong mét c©y, nÕu c¸c c©y con cña mçi ®Ønh ®-îc s¾p theo mét thø tù  
nhÊt ®Þnh, th× c©y ®-îc gäi lµ c©y ®-îc s¾p. Ch¼ng h¹n, h×nh 4.3 minh ho¹ hai  
c©y ®-îc s¾p kh¸c nhau,  
a
a
b
c
c
b
H×nh 4.3. Hai c©y ®-îc s¾p kh¸c nhau  
Sau nµy chóng ta chØ quan t©m ®Õn c¸c c©y ®-îc s¾p. Do ®ã khi nãi ®Õn  
c©y th× cÇn ®-îc hiÓu lµ c©y ®-îc s¾p.  
Gi¶ sö trong mét c©y ®-îc s¾p T, ®Ønh a cã c¸c con ®-îc s¾p theo thø  
tù : b1, b2, ..., bk (k 1). Khi ®ã ta nãi b1 lµ con tr-ëng cña a, vµ bi lµ anh liÒn  
kÒ cña bi+1 (bi+1 lµ em liÒn kÒ cña bi), i = 1,2, ..., k-1. Ta cßn nãi, víi i < j th×  
2
bi ë bªn tr¸i bj (bj ë bªn ph¶i bi). Quan hÖ nµy ®-îc më réng nh- sau. NÕu a ë  
bªn tr¸i b th× mäi hËu thÕ cña a ë bªn tr¸i mäi hËu thÕ cña b.  
VÝ dô. Trong h×nh 4.1, f lµ con tr-ëng cña c, vµ lµ anh liÒn kÒ cña ®Ønh  
g. §Ønh i ë bªn tr¸i ®Ønh g.  
C©y g¾n nh·n.  
C©y g¾n nh·n lµ c©y mµ mçi ®Ønh cña nã ®-îc g¾n víi mét gi¸ trÞ  
(nh·n) nµo ®ã. Nãi mét c¸ch kh¸c, c©y g¾n nh·n lµ mét c©y cïng víi mét ¸nh  
x¹ tõ tËp hîp c¸c ®Ønh cña c©y vµo tËp hîp nµo ®ã c¸c gi¸ trÞ (c¸c nh·n).  
Chóng ta cã thÓ xem nh·n nh- th«ng tin liªn kÕt víi mçi ®Ønh cña c©y. Nh·n  
cã thÓ lµ c¸c d÷ liÖu ®¬n nh- sè nguyªn, sè thùc, hoÆc còng cã thÓ lµ c¸c d÷  
liÖu phøc t¹p nh- b¶n ghi. CÇn biÕt r»ng, c¸c ®Ønh kh¸c nhau cña c©y cã thÓ  
cã cïng mét nh·n.  
Rõng.  
Mét rõng F lµ mét danh s¸ch c¸c c©y :  
F = (T1, T2, ..., Tn)  
trong ®ã Ti(i = 1, ..., n) lµ c©y (c©y ®-îc s¾p)  
Chóng ta cã t-¬ng øng mét - mét gi÷a tËp hîp c¸c c©y vµ tËp hîp c¸c  
rõng. ThËt vËy, mét c©y T víi gèc r vµ c¸c c©y con cña gèc theo thø tù tõ tr¸i  
sang ph¶i lµ T1, T2, ..., Tn, T = (r, T1, T2, ..., Tn) t-¬ng øng víi rõng F = (T1,  
T2, ..., Tn) vµ ng-îc l¹i.  
4.2. C¸c phÐp to¸n trªn c©y.  
Trong môc 1 chóng ta ®· tr×nh bµy cÊu tróc to¸n häc c©y. §Ó cã mét  
m« h×nh d÷ liÖu c©y, ta cÇn ph¶i x¸c ®Þnh c¸c phÐp to¸n cã thÓ thùc hiÖn ®-îc  
trªn c©y. Còng nh- víi danh s¸ch, c¸c phÐp to¸n cã thÓ thùc hiÖn ®-îc trªn  
c©y rÊt ®a d¹ng vµ phong phó. Trong sè ®ã, cã mét sè phÐp to¸n c¬ b¶n ®-îc  
sö dông th-êng xuyªn ®Ó thùc hiÖn c¸c phÐp to¸n kh¸c vµ thiÕt kÕ c¸c thuËt  
to¸n trªn c©y.  
4. 2.1. C¸c phÐp to¸n c¬ b¶n trªn c©y.  
1. T×m cha cña mçi ®Ønh.  
Gi¶ sö x lµ ®Ønh bÊt kú trong c©y T. Hµm Parent(x) x¸c ®Þnh cha cña  
®Ønh x. Trong tr-êng hîp ®Ønh x kh«ng cã cha (x lµ gèc) th× gi¸ trÞ cña hµm  
Parent (x) lµ mét ký hiÖu ®Æc biÖt nµo ®ã kh¸c víi tÊt c¶ c¸c ®Ønh cña c©y,  
ch¼ng h¹n $. Nh- vËy nÕu parent (x) = $ th× x lµ gèc cña c©y.  
2. T×m con bªn tr¸i ngoµi cïng (con truëng) cña mçi ®Ønh.  
Hµm EldestChild (x) cho ta con tr-ëng cña ®Ønh x. Trong tr-êng hîp x  
lµ l¸ (x kh«ng cã con) th× EldestChild (x) = $.  
3
3. T×m em liÒn kÓ cña mçi ®Ønh.  
Hµm NextSibling (x) x¸c ®Þnh em liÒn kÒ cña ®Ønh x. Trong tr-êng hîp  
x kh«ng cã em liÒn kÒ (tøc x lµ con ngoµi cïng bªn ph¶i cña mét ®Ønh nµo ®ã)  
th× NextSibling(x) = $.  
VÝ dô. Gi¶ sö T lµ c©y ®· cho trong h×nh 4.1. Khi ®ã Parent(e) = b,  
Parent(a) = $, EldestChild (c) = f, EldestChild (k) = $, NextSibling (g) = h,  
NextSibling (h) = $.  
4.2.2. §i qua c©y (duyÖt c©y).  
Trong thùc tiÔn chóng ta gÆp rÊt nhiÒu bµi to¸n mµ viÖc gi¶i quyÕt nã  
®-îc qui vÒ viÖc ®i qua c©y (cßn gäi lµ duyÖt c©y), "th¨m" tÊt c¶ c¸c ®Ønh cña  
c©y mét c¸ch hÖ thèng.  
Cã nhiÒu ph-¬ng ph¸p ®i qua c©y. Ch¼ng h¹n, ta cã thÓ ®i qua c©y lÇn  
l-ît tõ møc 0, møc 1,... cho tíi møc thÊp nhÊt. Trong cïng mét møc ta sÏ  
th¨m c¸c ®Ønh tõ tr¸i sang ph¶i. VÝ dô, víi c©y trong h×nh 4.1, danh s¸ch c¸c  
®Ønh lÇn l-ît ®-îc th¨m lµ (a, b, c, d, e, f, g,h, i, j, k). §ã lµ ph-¬ng ph¸p ®i  
qua c©y theo bÒ réng.  
Tuy nhiªn, ba ph-¬ng ph¸p ®i qua c©y theo c¸c hÖ thèng sau ®©y lµ  
quan träng nhÊt : ®i qua c©y theo thø tù Preorder, Inorder vµ Postorder. Danh  
s¸ch c¸c ®Ønh cña c©y theo thø tù Preordor, Inorder, vµ Postorder (gäi t¾t lµ  
danh s¸ch Preorder, Inorder, vµ Postorder) ®-îc x¸c ®Þnh ®Ö qui nh- sau :  
1. NÕu T lµ c©y gåm mét ®Ønh duy nhÊt th× c¸c danh s¸ch Preordor,  
Inorder vµ Postorder chØ chøa mét ®Ønh ®ã.  
2. NÕu T lµ c©y cã gèc r vµ c¸c c©y con cña gèc lµ T1, T2, ..., Tk (h×nh  
4.2) th×  
2a. Danh s¸ch Preorder c¸c ®Ønh cña c©y T b¾t ®Çu lµ r, theo sau lµ c¸c  
®Ønh cña c©y con T1 theo thø tù Preordor, råi ®Õn c¸c ®Ønh cña c©y con T2  
theo thø tù Preorder, ..., cuèi cïng lµ c¸c ®Ønh cña c©y con Tk theo thø tù  
Preordor.  
2b. Danh s¸ch Inorder c¸c ®Ønh cña c©y T b¾t ®Çu lµ c¸c ®Ønh cña c©y  
con T1 theo thø tù Inordor, råi ®Õn gèc r, theo sau lµ c¸c ®Ønh cña c¸c c©y con  
T2, ... Tk theo thø tù Inordor.  
2c. Danh s¸ch Postorder c¸c ®Ønh cña c©y T lÇn l-ît lµ c¸c ®Ønh cña c¸c  
c©y con T1, T2,...Tk, theo thø tù Postorder sau cïng lµ gèc r.  
VÝ dô, khi ®i qua c©y trong h×nh 4.1 theo thø tù Preordor ta ®-îc danh  
s¸ch c¸c ®Ønh lµ (a, b, d, e, i, j, c, f, g, k, h). NÕu ®i qua c©y theo thø tù  
Inorder, ta cã danh s¸ch (d, b, i, e, j, a, f, c, k, g, h). Cßn danh s¸ch Postorder  
lµ (d, i, j, e, b, f, k, g, h, c, a).  
4
Ph-¬ng ph¸p ®i qua c©y theo thø tù Preorder cßn ®-îc gäi lµ kü thuËt  
®i qua c©y theo ®é s©u. §ã lµ mét kü thuËt quan träng th-êng ®-îc ¸p dông  
®Ó t×m kiÕm nghiÖm cña c¸c bµi to¸n. Gäi lµ ®i qua c©y theo ®é s©u, bëi v× khi  
ta ®ang ë mét ®Ønh x nµo ®ã cña c©y (ch¼ng h¹n, ®Ønh b trong c©y ë h×nh 4.1),  
ta cè g¾ng ®i s©u xuèng ®Ønh cßn ch-a ®-îc th¨m ngoµi cïng bªn tr¸i chõng  
nµo cã thÓ ®-îc (ch¼ng h¹n, ®Ønh d trong c©y ë h×nh 4.1) ®Ó th¨m ®Ønh ®ã.  
NÕu tÊt c¶ c¸c ®Ønh con cña x ®· ®-îc th¨m (tøc lµ tõ x kh«ng thÓ ®i s©u  
xuèng ®-îc) ta quay lªn t×m ®Õn cha cña x. T¹i ®©y ta l¹i cè g¾ng ®i s©u  
xuèng ®Ønh con ch-a ®-îc th¨m. Ch¼ng h¹n, trong c©y ë h×nh 4.1, ta ®ang ë  
®Ønh f, t¹i ®©y kh«ng thÓ ®i s©u xuèng, ta quay lªn cha cña f lµ ®Ønh c. T¹i c  
cã thÓ ®i s©u xuèng th¨m ®Ønh g, tõ g l¹i cã thÓ ®i s©u xuèng th¨m ®Ønh k.  
Qu¸ tr×nh trªn cø tiÕp tôc cho tíi khi nµo toµn bé c¸c ®Ønh cña c©y ®· ®-îc  
th¨m.  
§èi lËp víi kü thuËt ®i qua c©y theo ®é s©u lµ kü thuËt ®i qua c©y theo  
bÒ réng mµ chóng ta ®· tr×nh bµy. Trong kü thuËt nµy, khi ®ang ë th¨m ®Ønh x  
nµo ®ã cña c©y, ta ®i theo bÒ ngang sang bªn ph¶i t×m ®Õn em liÒn kÒ cña x ®Ó  
th¨m. NÕu x lµ ®Ønh ngoµi cïng bªn ph¶i, ta ®i xuèng møc sau th¨m ®Ønh  
ngoµi cïng bªn tr¸i, råi l¹i tiÕp tôc ®i theo bÒ ngang sang bªn ph¶i.  
Sau ®©y chóng ta sÏ tr×nh bµy c¸c thñ tôc ®i qua c©y theo c¸c thø tù  
Preorder, Inorder, Postorder vµ ®i qua c©y theo bÒ réng.  
Sö dông c¸c phÐp to¸n c¬ b¶n trªn c©y vµ ®Þnh nghÜa ®Ö qui cña thø tù  
Preorder, chóng ta dÔ dµng viÕt ®-îc thñ tôc ®Ö qui ®i qua c©y theo thø tù  
Preorder. Trong thñ tôc, chóng ta sÏ sö dông thñ tôc Visit (x) (th¨m ®Ønh x)  
nã ®-îc cµi ®Æt tuú theo tõng øng dông. C¸c biÕn A, B trong thñ tôc lµ c¸c  
®Ønh (Node) cña c©y.  
procedure Preorder ( A : Node) ;  
{Thñ tôc ®Ö qui ®i qua c©y gèc A theo thø tù Preorder}  
var B : Node  
begin  
Visit (A) ;  
B : = EldestChild (A)  
while B < > $ do  
begin  
Preorder ( B) ;  
B : = NexSibling (B)  
end ;  
end ;  
5
Mét c¸ch t-¬ng tù, ta cã thÓ viÕt ®-îc c¸c thñ tôc ®Ö qui ®i qua c©y  
theo thø tù Inorder vµ Postorder.  
procedure Inorder ( A : Node) ;  
{Thñ tôc ®Ö qui ®i qua c©y gèc A theo thø tù Inorder }  
var B : Node ;  
begin  
B := EldestChild (A) ;  
if B < > $ then begin Inorder (B) : B : = NextSibling (B) end ;  
Visit (A) ;  
while B < > $ do  
begin  
Inorder (B) ;  
B : = NextSibling (B)  
end ;  
end ;  
procedure Postorder (A : Node) ;  
{Thñ tôc ®Ö qui ®i qua c©y gèc A theo thø tù Postorder}  
var  
B : Node ;  
begin  
B : = EldestChild (A) ;  
while B < > $ do  
begin  
Postorder (B) ;  
B : = NextSibling (B)  
end ;  
Visit (A)  
end ;  
Chóng ta còng cã thÓ viÕt ®-îc c¸c thñ tôc kh«ng ®Ö qui ®i qua c©y  
theo c¸c thø tù Preordor, Inorder vµ Postorder. Chóng ta sÏ viÕt mét trong ba  
thñ tôc ®ã (c¸c thñ tôc kh¸c giµnh l¹i cho ®éc gi¶). T- t-ëng c¬ b¶n cña thuËt  
to¸n kh«ng ®Ö qui ®i qua c©y theo thø tù Preorder lµ nh- sau. Chóng ta sÏ sö  
dông mét stack S ®Ó l-u gi÷ c¸c ®Ønh cña c©y. NÕu ë mét thêi ®iÓm nµo ®ã ta  
6
®ang ë th¨m ®Ønh x th× stack sÏ l-u gi÷ ®-êng ®i tõ gèc ®Õn x, gèc ë ®¸y cña  
stack cßn x ë ®Ønh stack. Ch¼ng h¹n, víi c©y trong h×nh 4.1, nÕu ta ®ang ë  
th¨m ®Ønh i, th× stack sÏ l-u (a, b, e, i) vµ i ë ®Ønh stack  
procedure  
Preorder ( A : Node) ;  
{Thñ tôc kh«ng ®Ö qui ®i qua c©y theo thø tù Preorder}  
var B : Node ;  
S : Stack ;  
begin  
Intealize (S) ; {khëi t¹o stack rçng}  
B : = A ;  
while B < > $ do  
begin  
Visit (B) ;  
Push (B, S) ; {®Èy B vµo stack}  
B : = EldestChild (B)  
end ;  
while not Empty (S) do  
begin  
Pop (S,B) ;{lo¹i phÇn tö ë ®Ønh stack vµ g¸n cho B]  
B : = NexSibling (B) ;  
if B < > $ then  
while B < > $ do  
begin  
Visit (B) ;  
Push (B, S) ;  
B : = EldestChild (B)  
end ;  
end ;  
end ;  
Sau ®©y chóng ta sÏ tr×nh bµy thuËt to¸n ®i qua c©y theo bÒ réng, chóng  
ta sÏ sö dông hµng Q ®Ó l-u gi÷ c¸c ®Ønh theo thø tù ®· ®-îc th¨m, ®Çu hµng  
lµ ®Ønh ngoµi cïng bªn tr¸i mµ ta ch-a th¨m c¸c con cña nã, cßn cuèi hµng lµ  
7
®Ønh ta ®ang ë th¨m. Ch¼ng h¹n, víi c©y trong h×nh 4.1, nÕu ta ®ang ë th¨m  
®Ønh i th× trong hµng sÏ chøa c¸c ®Ønh (f, g, h, i) trong ®ã f ë ®Çu hµng vµ i ë  
cuèi hµng. Khi lo¹i mét phÇn tö ë ®Çu hµng, chóng ta sÏ lÇn l-ît th¨m c¸c con  
cña nã (nÕu cã) vµ khi th¨m ®Ønh nµo th× ®-a ®Ønh ®ã vµo cuèi hµng. Chóng ta  
cã thñ tôc sau  
procedure BreadthTraverse ( A : Node) ;  
{Thñ tôc ®i qua c©y gèc A theo bÒ réng }  
var B : node ;  
Q : Queue ;  
begin  
Initialize (Q) ; {khëi t¹o hµng rçng}  
Visit (A) ;  
Add (A, Q) ; {®-a gèc A vµo hµng Q}  
while not Empty (Q) do  
begin  
Delete (Q, B) ; {lo¹i phÇn tö ®Çu hµng vµ g¸n cho B}  
B : = EldestChild (B) ;  
while B < > $ do  
begin  
Visit (B) ;  
Add (B, Q) ;  
B : = NextSibling (B)  
end ;  
end ;  
end ;  
4.3. Cµi ®Æt c©y.  
Trong môc nµy chóng ta sÏ tr×nh bµy c¸c ph-¬ng ph¸p c¬ b¶n cµi ®Æt  
c©y vµ nghiªn cøu kh¶ n¨ng thùc hiÖn c¸c phÐp to¸n c¬ b¶n trªn c©y trong  
mçi c¸ch cµi ®Æt.  
4.3.1. BiÓu diÔn c©y b»ng danh s¸ch c¸c con cña mçi ®Ønh.  
Ph-¬ng ph¸p th«ng dông ®Ó biÓu diÔn c©y lµ, víi mçi ®Ønh cña c©y ta  
thµnh lËp mét danh s¸ch c¸c ®Ønh con cña nã theo thø tù tõ tr¸i sang ph¶i.  
8
1. Cµi ®Æt bëi m¶ng.  
Trong c¸ch cµi ®Æt nµy, ta sÏ sö dông mét m¶ng ®Ó l-u gi÷ c¸c ®Ønh cña  
c©y. Mçi thµnh phÇn cña m¶ng lµ mét tÕ bµo chøa th«ng tin g¾n víi mçi ®Ønh  
vµ danh s¸ch c¸c ®Ønh con cña nã. Danh s¸ch c¸c ®Ønh con cña mét ®Ønh cã  
thÓ biÓu diÔn bëi m¶ng hoÆc bëi danh s¸ch liªn kÕt. Tuy nhiªn, v× sè con cña  
mçi ®Ønh cã thÓ thay ®æi nhiÒu, cho nªn ta sÏ sö dông danh s¸ch liªn kÕt. Nh-  
vËy mçi tÕ bµo m« t¶ ®Ønh cña c©y lµ mét b¶n ghi gåm hai tr-êng : tr-êng  
infor chøa th«ng tin g¾n víi ®Ønh, tr-êng Child lµ con trá tíi danh s¸ch c¸c  
con cña ®Ønh ®ã. Gi¶ sö c¸c ®Ønh cña c©y ®-îc ®¸nh sè tõ 1 ®Õn N víi c¸ch  
cµi ®Æt nµy, ta cã thÓ khai b¸o cÊu tróc d÷ liÖu biÓu diÔn c©y nh- sau :  
const N = ... ; { N lµ sè lín nhÊt c¸c ®Ønh mµ c©y cã thÓ cã }  
type pointer = ^ Member :  
Member = record  
id : 1..N ;  
next : pointer  
end ;  
Node = record  
infor : item ;  
child : pointer  
end ;  
Tree = array [1 ... N] of Node ;  
Trong khai b¸o trªn, Member biÓu diÔn c¸c thµnh phÇn cña danh s¸ch  
c¸c con, cßn Node biÓu diÔn c¸c ®Ønh cña c©y. Víi c¸ch cµi ®Æt nµy, cÊu tróc  
d÷ liÖu biÓu diÔn c©y trong h×nh 4.4a ®-îc minh ho¹ trong h×nh 4.4b.  
Ta cã nhËn xÐt r»ng, trong c¸ch cµi ®Æt nµy, víi mçi ®Ønh k ta x¸c ®Þnh  
ngay con tr-ëng cña nã. Ch¼ng h¹n, víi c©y trong h×nh 4.4b, con tr-ëng cña  
®Ønh 3 lµ ®Ønh 6, con tr-ëng cña ®Ønh 5 lµ 9, cßn ®Ønh 6 kh«ng cã con. PhÐp  
to¸n t×m con tr-ëng EldestChild (k) cã thÓ ®-îc m« t¶ bëi hµm sau.  
function  
var P : pointer ;  
begin  
if T[k] < > nil then  
begin  
EldestChild ( k : 1 ...N ; T : Tree) : 0 ...N ;  
9
P : = T[k]. child ;  
EldestChild : = P^. id ;  
end else EldestChild : = 0  
end ;  
Tuy nhiªn trong c¸ch cµi ®Æt nµy, viÖc t×m cha vµ em liÒn kÒ cña mçi  
®Ønh l¹i kh«ng ®¬n gi¶n. Ch¼ng h¹n, ®Ó t×m cha cña ®Ønh k, ta ph¶i duyÖt c¸c  
danh s¸ch c¸c con cña mçi ®Ønh. NÕu ph¸t hiÖn ra trong danh s¸ch c¸c con  
cña ®Ønh m cã chøa k th× Parent (k) = m. Hµm Parent (k) ®-îc x¸c ®Þnh nh-  
sau :  
function  
Parent (k : 1 ...N ; T : Tree) : 0 ...N ;  
var P : pointer ;  
i : 1 ... N ;  
found : boolean ;  
begin  
i : = 1 ;  
found : = false ;  
while ( i < = N) and (not found) do  
begin  
P : = T[i].child ;  
while (P < > nil) and (not found) do  
if P^.id = k then  
begin  
Parent : = i :  
found : = true ;  
end else P : = P^.next ;  
i: = i + 1  
end ;  
if not found then Parent : = 0 ;  
end ;  
Mét c¸ch t-¬ng tù (duyÖt c¸c danh s¸ch c¸c con), ta còng cã thÓ t×m  
®-îc em liÒn kÒ cña mçi ®Ønh. M« t¶ chi tiÕt hµm NextSibling ®-îc ®Ó l¹i  
xem nh- bµi tËp.  
10  
A 1  
B 2  
E 5  
I 9  
infor child  
C 3  
F 6 G 7  
M 11  
D 4  
H 8  
K 10  
id  
(a)  
next  
1
2
3
4
5
6
7
8
9
10  
11  
(b)  
H×nh 4.4 CÊu tróc d÷ liÖu biÓu diÔn c©y  
2. Cµi ®Æt bëi con trá.  
NÕu kh«ng dïng m¶ng ®Ó l-u gi÷ c¸c ®Ønh cña c©y, ta cã thÓ sö dông  
c¸c con trá trá tíi c¸c ®Ønh cña c©y. T¹i mçi ®Ønh, ta sÏ sö dông mét danh  
s¸ch c¸c con trá trá tíi c¸c con cña nã, danh s¸ch nµy ®-îc cµi ®Æt bëi m¶ng  
c¸c con trá. Mét con trá Root ®-îc sö dông ®Ó trá tíi gèc cña c©y. Ta cã thÓ  
khai b¸o cÊu tróc d÷ liÖu biÓu diÔn c©y trong c¸ch cµi ®Æt nµy nh- sau.  
const K = ..... ; {K lµ sè tèi ®a c¸c con cña mçi ®Ønh}  
type pointer = ^Node ;  
11  
Note = record  
infor : item ;  
child : array [1...K] of pointer  
end ;  
var Root : pointer ;  
Víi c¸ch cµi ®Æt nµy, cÊu tróc d÷ liÖu biÓu diÔn c©y trong h×nh 4.4a  
®-îc minh ho¹ trong h×nh 4.5.  
Root  
H×nh 4.5 CÊu tróc d÷ liÖu biÓu diÔn c©y  
Gi¶ sö P lµ mét con trá trá tíi mét ®Ønh nµo ®ã trong c©y, ta sÏ gäi ®Ønh  
nµy lµ ®Ønh P. Sau ®©y ta sÏ xÐt xem c¸c phÐp to¸n t×m con tr-ëng cña nã  
EldesChild (P), t×m cha cña nã Parent (P) vµ t×m em liÒn kÒ NexSibling (P)  
®-îc thùc hiÖn nh- thÕ nµo. DÔ dµng thÊy r»ng, còng nh- trong c¸ch cµi ®Æt  
bëi m¶ng, ta cã thÓ x¸c ®Þnh ®-îc ngay con tr-ëng cña mét ®Ønh. B¹n ®äc tù  
viÕt lÊy hµm EldestChild. T- t-ëng cña thuËt to¸n t×m cha cña ®Ønh P còng  
kh«ng cã g× kh¸c tr-íc, khi c©y cµi ®Æt bëi m¶ng, tøc lµ ta còng ph¶i duyÖt  
c¸c ®Ønh con cña mçi ®Ønh. Song tr-íc kia, khi c¸c ®Ønh cña c©y ®-îc l-u  
trong m¶ng, viÖc ®i lÇn l-ît qua c¸c ®Ønh cña c©y ®Ó xÐt c¸c con cña nã ®-îc  
thùc hiÖn rÊt dÔ dµng. Cßn ë ®©y ta ph¶i sö dông mét hµng (Queue) H ®Ó l-u  
c¸c ®Ønh ®· ®-îc xÐt. §Çu tiªn hµng chøa gèc Root cña c©y. T¹i mçi thêi  
12  
®iÓm ta sÏ lo¹i ®Ønh Q ë ®Çu hµng ra khái hµng vµ xÐt c¸c con cña nã. NÕu  
mét trong c¸c ®Ønh con cña Q lµ P th× Parent (P) = Q, trong tr-êng hîp ng-îc  
l¹i ta sÏ ®-a c¸c ®Ønh con cña Q vµo cuèi hµng. Hµm Parent ®-îc x¸c ®Þnh  
nh- sau.  
function Parent (P : pointer ; Root : pointer) : pointer ;  
var Q, R : pointer ;  
H : Queue ;  
found : boolean ;  
begin  
Initialize (H) ; {khëi t¹o hµng rçng H}  
Addqueue (Root, H) ; {§-a Root vµo hµng}  
found : = false ;  
while (not Emty (H) and (not found) do  
begin  
DeleteQueue (H, Q) ; {Lo¹i Q khái ®Çu hµng}  
i : = 0 ;  
repeat  
i : = i + 1 ;  
R : = Q^. child [i] ;  
if R < > nil then  
if R = P then  
begin  
Parent : = Q  
found : = true  
end else AddQueue (R, H)  
until found or (R = nil) or (i = N)  
end ;  
if not found then Parent : = nil  
end ;  
Mét c¸ch hoµn toµn t-¬ng tù, ta cã thÓ viÕt ®-îc hµm t×m em liÒn kÒ  
NextSibling.  
13  
4.3.2. BiÓu diÔn c©y b»ng con tr-ëng vµ em liÒn kÒ cña mçi ®Ønh.  
Mét ph-¬ng ph¸p th«ng dông kh¸c ®Ó biÓu diÔn c©y lµ, víi mçi ®Ønh  
cña c©y ta chØ ra con tr-ëng vµ em liÒn kÒ cña nã.  
1. Cµi ®Æt bëi m¶ng.  
Gi¶ sö c¸c ®Ønh cña c©y ®-îc ®¸nh sè tõ 1 ®Õn N. Dïng m¶ng ®Ó l-u  
gi÷ c¸c ®Ønh cña c©y, mçi ®Ønh ®-îc biÓu diÔn bëi b¶n ghi gåm ba tr-êng,  
ngoµi tr-êng infor, c¸c tr-êng EldestChild vµ Nexsibling sÏ l-u con tr-ëng vµ  
em liÒn kÒ cña mçi ®Ønh. Ta cã thÓ khai b¸o nh- sau :  
type Node = record  
infor : item ;  
EldestChild : 0...N ;  
NextSibling : 0...N  
end ;  
Tree = array[1...N] of Node ;  
H×nh 4.6 Minh ho¹ cÊu tróc d÷ liÖu biÓu diÔn c©y trong h×nh 4.4a.  
Trong c¸ch biÓu diÔn nµy, EldestChild vµ NexSibling ®-îc ®-a vµo lµm  
c¸c tr-êng cña b¶n ghi biÓu diÔn mçi ®Ønh cña c©y. Do ®ã, ta chØ cßn ph¶i xÐt  
phÐp to¸n t×m cha cña mçi ®Ønh. Còng nh- tr-íc kia, ®Ó t×m cha cña mét ®Ønh  
k nµo ®ã, ta sÏ lÇn l-ît ®i qua c¸c ®Ønh cña c©y, víi mçi ®Ønh ta t×m ®Õn c¸c  
con cña nã, cho tíi khi t×m thÊy ®Ønh k. Cô thÓ ta cã thÓ m« t¶ hµm Parent(k)  
nh- sau :  
function Parent (k : 1 ... N ; T : Tree) : 0 ... N ;  
var i, j : 0 ... N ;  
found : boolean ;  
begin  
i : = 1 ;  
found : = false ;  
while (i <=N) and (not found) do  
begin  
j : = T[i]. EldestChild ;  
if j = k then begin  
Parent : = i ;  
found : = true  
end  
14  
else begin  
j : = T[j]. NextSibling ;  
while (j < > 0) and (not found) do  
if j = k then begin  
Parent : = i ;  
found : = true  
end  
else j : = T[j].NextSibling ;  
end ;  
i : = i+1  
end ;  
if not found then Parent : = 0  
end ;  
infor  
A
B
EldestChild NextSibling  
1
2
2
4
0
3
3
C
6
0
4
D
E
0
5
5
9
0
6
F
0
7
H×nh 4.6  
7
G
H
I
11  
0
8
8
0
9
0
10  
0
10  
11  
K
M
0
0
0
2. Cµi ®Æt bëi con trá.  
Thay cho dïng m¶ng, ta cã thÓ sö dông c¸c con trá ®Ó cµi ®Æt. Khi ®ã  
trong b¶n ghi Node, c¸c tr-êng EldestChild vµ NextSibling sÏ lµ c¸c con trá.  
C©y sÏ ®-îc biÓu diÔn bëi cÊu tróc sau.  
type pointer = ^Node ;  
Node = record  
15  
infor : item ;  
EldestChild : pointer ;  
NextSibling : pointer ;  
end ;  
var Root : pointer ;  
Trong c¸ch cµi ®Æt nµy, c©y trong h×nh 4.4a ®-îc biÓu diÔn bëi cÊu tróc  
d÷ liÖu trong h×nh 4.7.  
Root  
H×nh 4.7 CÊu tróc d÷ liÖu biÓu diÔn c©y  
§éc gi¶ h·y tù viÕt lÊy thñ tôc t×m cha cña ®Ønh P, Parent (P), trong ®ã  
P lµ con trá, trong c¸ch cµi ®Æt nµy.  
4.3.3. BiÓu diÔn c©y bëi cha cña mçi ®Ønh.  
Trong mét sè ¸p dông, ng-êi ta cßn cã thÓ sö dông c¸ch biÓu diÔn c©y  
®¬n gi¶n sau ®©y. Gi¶ sö c¸c ®Ønh cña c©y ®-îc ®¸nh sè tõ 1 ®Õn N. Dùa vµo  
tÝnh chÊt, mçi ®Ønh cña c©y (trõ gèc) ®Òu cã mét cha, ta sÏ dïng mét m¶ng  
A[1...N] ®Ó biÓu diÔn c©y, trong ®ã A[k] = m nÕu ®Ønh m lµ cha cña ®Ønh k.  
Trong tr-êng hîp cÇn quan t©m ®Õn c¸c th«ng tin g¾n víi mçi ®Ønh, ta cÇn  
ph¶i ®-a vµo mçi thµnh phÇn cña m¶ng tr-êng infor m« t¶ th«ng tin ë mçi  
®Ønh. C©y ®-îc biÓu diÔn bëi cÊu tróc sau.  
16  
const N = ... ;  
type Node = record  
infor : item ;  
parent : 0 ...N ;  
end ;  
Tree = array [1...N] of Node ;  
var T : Tree ;  
H×nh 4.8. minh ho¹ cÊu tróc d÷ liÖu biÓu diÔn c©y trong h×nh 4.4a.  
infor  
A
B
parent  
1
2
0
1
1
2
2
3
3
3
5
5
5
3
C
4
D
E
5
6
F
7
G
H
I
8
9
10  
11  
K
M
H×nh 4.8 minh ho¹ cÊu tróc d÷ liÖu biÓu diÔn c©y trong h×nh 4.4a.  
4.4. C©y nhÞ ph©n.  
B¾t ®Çu tõ môc nµy chóng ta sÏ xÐt mét d¹ng c©y ®Æc biÖt : c©y nhÞ  
ph©n.  
C©y nhÞ ph©n lµ mét tËp hîp h÷u h¹n c¸c ®Ønh ®-îc x¸c ®Þnh ®Ö qui  
nh- sau.  
1. Mét tËp trèng lµ c©y nhÞ ph©n  
17  
2. Gi¶ sö T1 vµ T2 lµ hai c©y nhÞ ph©n kh«ng c¾t nhau (T1T2 = ) vµ r  
lµ mét ®Ønh míi kh«ng thuéc T1, T2. Khi ®ã ta cã thÓ thµnh lËp mét c©y nhÞ  
ph©n míi T víi gèc r cã T1 lµ c©y con bªn tr¸i, T2 lµ c©y con bªn ph¶i cña  
gèc. C©y nhÞ ph©n T ®-îc biÓu diÔn bëi h×nh 4.9.  
r
T1  
T2  
H×nh 4.9. C©y nhÞ ph©n cã gèc r, c©y con tr¸i T1, c©y con ph¶i T2.  
CÇn l-u ý r»ng, c©y (c©y cã gèc) vµ c©y nhÞ ph©n lµ hai kh¸i niÖm kh¸c  
nhau. C©y kh«ng bao giê trèng, nã lu«n lu«n chøa Ýt nhÊt mét ®Ønh, mçi ®Ønh  
cã thÓ kh«ng cã, cã thÓ cã mét hay nhiÒu c©y con. Cßn c©y nhÞ ph©n cã thÓ  
trèng, mçi ®Ønh cña nã lu«n lu«n cã hai c©y con ®-îc ph©n biÖt lµ c©y con  
bªn tr¸i vµ c©y con bªn ph¶i. Ch¼ng h¹n, h×nh 4.10 minh ho¹ hai c©y nhÞ ph©n  
kh¸c nhau. C©y nhÞ ph©n trong h×nh 4.10a cã c©y con tr¸i cña gèc gåm mét  
®Ønh, cßn c©y con ph¶i trèng. C©y nhÞ ph©n trong h×nh 4.10b cã c©y con tr¸i  
cña gèc trèng, cßn c©y con ph¶i gåm mét ®Ønh. Song ë ®©y ta chØ cã mét c©y :  
®ã lµ c©y mµ gèc cña nã chØ cã mét c©y con gåm mét ®Ønh.  
a)  
b)  
H×nh 4.10. Hai c©y nhÞ ph©n kh¸c nhau  
Tõ ®Þnh nghÜa c©y nhÞ ph©n, ta suy ra r»ng, mçi ®Ønh cña c©y nhÞ ph©n  
chØ cã nhiÒu nhÊt lµ hai ®Ønh con, mét ®Ønh con bªn tr¸i (®ã lµ gèc cña c©y  
con tr¸i) vµ mét ®Ønh con bªn ph¶i (®ã lµ gèc cña c©y con ph¶i).  
18  
1 A  
2 B  
3 C  
4 D 5 E  
6 F  
7 G  
8 H 9 I 10 J  
11 K  
H×nh 4.11. Mét c©y nhÞ ph©n  
Cµi ®Æt c©y nhÞ ph©n.  
Ph-¬ng ph¸p tù nhiªn nhÊt ®Ó biÓu diÔn c©y nhÞ ph©n lµ chØ ra ®Ønh con  
tr¸i vµ ®Ønh con ph¶i cña mçi ®Ønh.  
Ta cã thÓ sö dông mét m¶ng ®Ó l-u gi÷ c¸c ®Ønh cña c©y nhÞ ph©n. Mçi  
®Ønh cña c©y ®-îc biÓu diÔn bëi b¶n ghi gåm ba tr-êng : tr-êng infor m« t¶  
th«ng tin g¾n víi mçi ®Ønh, truêng left chØ ®Ønh con tr¸i, tr-êng right chØ ®Ønh  
con ph¶i. Gi¶ sö c¸c ®Ønh cña c©y ®-îc ®¸nh sè tõ 1 ®Õn max, khi ®ã cÊu tróc  
d÷ liÖu biÓu diÔn c©y nhÞ ph©n ®-îc khai b¸o nh- sau.  
const  
type  
max = N ;  
Node = record  
infor : Item ;  
left : 0 ... max ;  
right : 0 ... max  
end ;  
Tree = array [1... max] of Node ;  
H×nh 4.12 minh ho¹ cÊu tróc d÷ liÖu biÓu diÔn c©y nhÞ ph©n trong h×nh  
4.11.  
19  
Tải về để xem bản đầy đủ
doc 46 trang baolam 20240 Free
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", để 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:

  • docbai_giang_cau_truc_du_lieu_va_giai_thuat_chuong_4_cay.doc