ii
“1393-Juvan-Rekonstrukcija” — 2010/8/17 — 13:53 — page 1 — #1 ii
ii
ii
List za mlade matematike, fizike, astronome in računalnikarje
ISSN 0351-6652Letnik 27 (1999/2000)Številka 2Strani 78–82
Martin Juvan:
REKONSTRUKCIJA DREVES, 1. del
Ključne besede: računalništvo, programiranje, dvojiška drevesa, pa-scal.
Elektronska verzija: http://www.presek.si/27/1393-Juvan.pdf
c© 1999 Društvo matematikov, fizikov in astronomov Slovenijec© 2010 DMFA – založništvo
Vse pravice pridržane. Razmnoževanje ali reproduciranje celote aliposameznih delov brez poprejšnjega dovoljenja založnika ni dovo-ljeno.
Računalništvo I
REKONSTRUKCIJA D REVES , 1. DEL
Dvojiška drevesa (ang l. binary trees) so ena od podatkovnih strukt ur, skatero se pri programiranju zelo pogost o srečamo . Najlažje ji h opišemorekurzivno: dvoj iško drevo je bodisi prazno ali pa je sest avlje no iz od li-kovanega vozlišča (pravimo mu koren) in dveh poddreves (levo in desnopoddrevo) , ki sta zope t dvo j iški drevesi . S sliko to običajno prikažemotakole:
korenK drevesa
levopoddrevo L
desnoD poddrevo
Smi sel up orabe dvo ji ških dr eves je, da v vozliščih hranimo podatke.Ti so lahko šte vila , znaki, nizi znakov, kazalci it n. Poleg podatkov po-t re buje mo še infor macijo o tem, kako so vozlišča med sebo j povezana vdvoj iško drevo (običaj no sta to kazalca na kor ena obeh poddreves).
Poglejmo, kakšna je običajna predstavitev dvoj iških dreves s kazalciv programskem jeziku pascal. P od atek, ki ga bom o hr anili v posameznemvozlišču , bo en znak (pri resnih up or abah so podat ki v vozliščih sevedabo lj obsež ni in zapleteni) . V pascalu vozlišče predst avimo s sestavlje nimt ip om - zapisom (besedica record) , drevo pa s kazalc em na njegov kor en :
t ypeDr evo = - Voz l isce;Vozlisce = r ecord
x : char;l evo ,desno: Dre vo ;
end ;
E no od pogostih op ravil z d vo j iški m i drevesi (pa t u di z drugimipodatkovnimi strukturami) je spreho d skozi vsa vozlišča drevesa . Smiselspreho da je, da pri t em pogledamo (obiščemo) pod atke v vseh vozliščih inv vsakem vozlišču primerno ukr epamo (izpišemo pod atek, ga spreme nimo,morda i zračunamo vsoto ali kako drugo statistično inform acijo o podat kihv vozliščih , včasih pa pr i pregledu tudi sprem enimo samo "obliko" dre-vesa ). Vozlišča drevesa lahko pr egled amo v različnih vrstnih red ih. Zelopogost o srečamo nasled nje tri pregled e (vrs t ne rede obiska vozlišč):
Računalništvo
Vmesni pregled. Pri njem naj prej obiščemo levo poddrevo, nato korendrevesa, nazadnje pa še des no poddr evo . Seveda ob e poddrevesi spetpregledamo v vmesnem vrstnem red u. Za to vrsto pregleda večkratuporab ljamo kratico LKD.
- Premi pregled. Pri njem najprej obiščemo koren dr evesa , nato pa levoin nazadnj e še desno poddrevo. Obe poddrevesi seveda pr egledamov premem vrstnem redu. Za to vrsto pr egleda uporabljamo kraticoKLD.
- Pregled po nivojih. Vozlišča v drevesu lahko raz delimo glede naoddaljenost od korena. Za vozlišča dr evesa , ki so enako oddaljenaod korena, pravimo, da sest avljajo nivo drevesa. Tako je nivo Osestavljen le iz korena dr evesa , nivo 1 iz sinov korena itn. Pri pr egledupo nivo jih najprej pr egledamo nivo O(torej koren), nato nivo 1 (sinovekorena) , potem nivo 2 (sinove sinov korena) it n. Vozlišča, ki sona istem nivoju, pregledamo "od leve proti desni" , to rej v enakemvrstnem redu , kot jih srečamo t udi pri vm esnem in premem preg ledu.
P rimere pregledov si lah ko ogledate na spodnji sliki:
c
H A vmesni pregled
premi pregled
KMHZC LA
CHKMZAL
K
M
z L pregled po nivojih CHA K Z L M
Več o delu z drevesi (in kodo v pascalu) si lahko pr eberete v poglavj uo dinamiČl~ih podatkovnih strukturah v knjigi N. Wirth : Računalniškoprogramiranje, 1. del.
V nadalj evan ju prispevka nas bo zanimalo, kako iz gornjih pregledovrekonstruirati (torej ponovno zgra dit i) drevo . Kot pr egled dr evesa razu-memo zaporedje podatkov iz vozlišč drevesa v t akem vrstnem redu, kot donjih pride izbrani pregled dr evesa. V našem primeru bo mo torej poznalizaporedj a znakov, iz njih pa bomo poskušali zgraditi drevo, kateregapregledi bod o ravno začetna zaporedja znakov.
Seveda, če poznamo le en pr egled , drevo z njim (razen če je pr aznooziroma ima le eno vozlišče) ni enolično določeno . Pri pr emem pregled uin pr egledu po nivoj ih sicer lahko določimo koren (to je kar prvo obiskano
Iso Računa lništvo Ivozlišče), ali je drugo ob iskano vozlišče koren levega ali desnega poddre-vesa , pa se ne moremo več odloči ti . Iz vmes neg a pregleda pa ne moremorazbrati niti korena; katerokoli vozlišče iz pregleda bi lahko bilo koren .
Zato bomo privzeli, da po znamo dva od gorn jih treh pregledov dre-vesa . Pri rekonstrukciji naletimo še na eno težavo. Zgodi se lahko,da se podatki v vozliščih ponavljajo (v skrajnem primeru je lahko vvseh vozliščih isti znak) . V takem primeru za po javitve znakov v prvempregled u ne moremo enolično določiti pripadajočih poj avitev v drugempregledu. Na primer , če vsa vozlišča drevesa vsebujejo neki znak x , potemvsi pregledi takega drevesa vrnejo zaporedje x-ov , in sicer ne glede na to,kakšn o je v resni ci drevo (važno je le, koliko vozlišč ima) . Ker bomo po-skušali rekonstruirati le dr evesa , ki so s pregl edi enolično določena , bomopredpostavili , da vsak znak nast opi kvečjemu v enem vozlišču (vozliščavsebuj ejo različne znake).
Vmesni in premi pregled: Prvi znak v premem pr egledu pripadakorenu drevesa. Poiščemo ga v vm esn em pregledu. Znaki , ki v vm esnempregledu nas topaj o pred njim, pripadajo vozliščem levega poddrevesa,znaki, ki so za njim, pa vozliščem desnega poddrevesa. Hkrat i še izvemo,koliko vozlišč ima levo in koliko desno poddrevo . Ker tudi pri premempregledu pregledamo levo poddrevo v celot i pred desnim poddrevesom ,lahko premi pregled (brez prvega znaka - kor ena) razdelimo na del, kipripada levemu poddrevesu , in del, ki pripad a desnemu poddrevesu :
vmesni pregled premi pr egled
K M H Z'---vo---'levo poddrevo
C'-v-"koren
LA'-v-"
desno poddrevo
C'-v-"koren
HK M Z'---vo---'levo poddrevo
AL'-v-"
desno poddrevo
Obe pod drevesi zgradimo rekurzivno na enak način .
function Zgrad i (vmes n i ,prem i : s t r i ng; var nap ak a : boolean) : Drevo;{ Iz vmesnega i n premega pregleda r ekonstruira dvoj i š ko dr evo. }
f unction Zgradi _R(zacV,zacP ,vel : intege r ) : Drevo ;{ Vmesni pregled se začne pri zacV, premi pa pri zacP. Dr evo ima }{ ve l vozlišč . Funkc i j a uporablja spremenl j ivke vmesni, premi i n }{ nap aka iz funkci j e Zgradi. }
va rkor: i nteger; { i ndeks korena v vmesnem pregledu}kaz: Dr evo ; { pomožni kazalec za novo vozl i š č e }
I Računalništvo
beginZgradi_R ;= ni l ;it vel >O then begin { Drevo ni prazno . }
kor ;= zacV ; { Poi~čemo kor en v vmesnem pregledu. }whi l e (vmesni [kor ] pr emi [zacP]) and (kor=zacV+vel then
napaka ;= true { Napačni vhodn i podatki. }el s e begin
ne w(kaz ) ;kaz- .x ;= premi [zacP] ;kaz - . levo ;= Zgradi_R(zacV,zacP+l,kor-zacV);kaz - .desno := Zgradi _R(kor+l,zacP+kor-zacV+l,zacV+vel -kor- l);Zgradi_R . = kaz;
end ;end;
end; {Zgradi_Rl
begin {Zgradi}napaka ;= length (vmesni ) length (premi) ;it napaka then
Zgradi nilelse
Zgradi . - Zgradi _R( l,l, length(vmesni));end; {Zgradi}
Funkciji Zgradi smo poleg ob eh pr egledov dodali še en parameter:logično spreme nlj ivko napaka. Prek nje klicat elju funkcije sporočimo, alije bila rekonstrukcija drevesa uspešn a. Pri gr ad nji drevesa zaz namo dv evr sti napak . Že t akoj na začetku st a pregleda lahko različne dolžin e. Tedajdrev~sa sploh ne poskušamo zgrad it i, sa j je s pregledo ma očitno nekajnarobe. Če sta niza z opisoma pregledov enako dolga , pri rekurzivnihklicih funkcije Zgradi-R posk rb imo , da ost an et a enako dolga t udi prinadaljnjih rekurzivnih klicih. Drugo mesto, kjer t udi lahko odkrij em onapako , pa je pri iskanju položaja koren a v vmesnem pr egledu. Lahko sezgodi, da korena ne naj demo. Tedaj p ost avimo indikat or napaka na t ruein vrnemo prazno drevo (vrednos t nil) kot rezultat tekočega klica fun kcijeZgradi-R. Za celotno funkcijo Zgradi to pomeni , da klj ub napačnimpodatkom vseeno zgradi del drevesa , za katerega domneva , da je z danimapregledoma opisan pravilno. Kor ist ilo vam bo, če fun kcijo preskusite še znekaj napačnimi pod atki in si pozorn o ogledate zgrajcna dr evesa , Če seklic funkcije Zgradi konča brez napake, potem sta vmesni in premi pr egledzgraje nega dr evesa vedno enaka vhodnima pregledom a, ni pa nujno, da
je to ediao drew s ta laatxmtjo. FbMia namrei5 ne pmmea d E n o s t i &itwe (vdto mame, daprmpj%~vbv zrda v premam pFe$Eedu nstrerta nj& pmi pojavihi v vmemm pmgled$ pi p d ~ f k i a radihih smkihv ~~~ je-topammIlmisel96ob~f~).
P&rn&imjms, L &ismno i n p d z&tammt fturlodSe win N a j i m a ~ o d r e F o o n ~ . ~ ~ ~ ~ e ~ ~ j e ~ h + I ( ~ r k l i w , v b W ~ ~ ~ h n + l k l i o e ~ r m p r d pud-h & pride do mp&q je IsE~mf h h b tudi ma@. Pri ~wakem --Imren,tmej-mddplri&j*a- suqp pmgleda &wih mdmv, ki jih ~ l e d a m o , je mmjeno a n, (Zablro seqgodi, d a j e ~ w d n w ~ ~ ~ p ~ ~ pmmblite, kakeaso je potem drevo.) Ckhtm P d o o&j je torsj mtejem a ~ t n o ~ j o ~ a ~ ~ ~ ~ ~ i l , p a j e l a h k n t u & b m e, Chmimo Frs kali6n.o pmm@da, ki ga potmbnje fin&- cg* Zgrajam drmw& &qBrn0 % R mpbv kip8 Vaal i s c%, @ pads$ pa uperrrbljamo ga pomoha spremaZrtivh, To m pmanwtd in lolahe a p ~ " r v k e v iimk@ zgtaai_W, nekaf pomdhib pa sasedejo tudi nam "u&W q m m d l , M jib vpelje ~j~ m ~ ~ d g t v o ' o rthmipnih klicih. Ker se go fpom kIica fmhije pomnilpik, ki ga 6 J o garamdid, klk&w s p m v b in %premenlSieplw a9 knjPgd dms, qmd, je mjv&jra h t i d a m ItoIlEb pcwmkib wrwmerzm z gbbina d u d j e . NajveE globina rdar@ie pa e o d h Qd globine (iiltmdh n e , p r d nivojev) dreverns, ki ga gradha. b je dram UizMjenon (+ vcaWe Sma le mega dm), je globiua +js (endm js ps), mj- maqjik par je prl 'krmwmm'' dnmsu (d h j i , mwn morda dnjegq so v Belot3 mp&jeni). Wj je enaka llwa raJ $-I ( a a trditm mhtem kmjl r d 6 t t in ski00 ali dw).