6
List za mlade matematike, fizike, astronome in raˇ cunalnikarje ISSN 0351-6652 Letnik 27 (1999/2000) Številka 2 Strani 78–82 Martin Juvan: REKONSTRUKCIJA DREVES, 1. del Kljuˇ cne besede: raˇ cunalniš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 Slovenije c 2010 DMFA – založništvo Vse pravice pridržane. Razmnoževanje ali reproduciranje celote ali posameznih delov brez poprejšnjega dovoljenja založnika ni dovo- ljeno.

REKONSTRUKCIJA DREVES, 1. del - Presek · 2010. 8. 23. · Računalništvo I REKONSTRUKCIJA DREVES, 1. DEL Dvojiška drevesa (angl. binary trees) so ena od podatkovnih struktur, s

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

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