1 / 20

Drevo

Drevo. deblo, veje drevesna struktura imenikov drevo razvoja živalskih vrst drevo prednikov organizacijske strukture iskalna drevesa. Grafična ponazoritev oklepaji … vozlišče oče sin list koren stopnja vozlišča. predniki potomci nivo globina (višina) drevesa izrojeno drevo

krikor
Download Presentation

Drevo

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Drevo • deblo, veje • drevesna struktura imenikov • drevo razvoja živalskih vrst • drevo prednikov • organizacijske strukture • iskalna drevesa • ...

  2. Grafična ponazoritev oklepaji … vozlišče oče sin list koren stopnja vozlišča predniki potomci nivo globina (višina) drevesa izrojeno drevo urejeno drevo levo izrojeno drevo levo poravnano drevo Zapisi dreves

  3. Vrste dreves • dvojiška drevesa • drevo prednikov • aritmetičnega izraza • 2-3 drevesa • AVL drevesa • B-drevesa • najbolj leva drevesa • ...

  4. Dvojiško drevo • urejeno drevo • stopnja vozlišč največ dva • definicija • dvojiško drevo je bodisi prazno ali pa ga sestavlja posebej odlikovano vozlišče koren, ki ima levo in desno poddrevo

  5. structureDVOJISKO DREVO declare pripravi: 0  dvojisko drevo; sestavi: (dvojisko drevo, podatek, dvojisko drevo)  dvojisko drevo; vrni: dvojisko drevo  podatek; levi sin: dvojisko drevo  dvojisko drevo; desni sin: dvojisko drevo  dvojisko drevo; prazno: dvojisko drevo  {true, false}; where levi sin(pripravi) ::= NAPAKA; levi sin(sestavi(l,k,d) ::= l; desni sin(pripravi) ::= NAPAKA; desnisin(sestavi(l,k,d) ::= d; prazno(pripravi) ::= true; prazno(sestavi(l,k,d) ::= false; vrni(pripravi) ::= NAPAKA; vrni(sestavi(l,k,d) ::= k; end;

  6. Lastnosti dvojiških dreves • Število vozlišč na nivoju k • največ 2k-1 • Število vseh vozlišč • največ 2k - 1 • najmanj k • Potomcev • najmanj k-1, največ 2k-1 - 1 • Prednikov • k - 1

  7. tabela razvrstimo elemente po nivojih na istem nivoju od leve v desno zgled levi sini = 2i, če i ima levega sina, nedef. sicer desni sini = 2i+1, če i ima desnega sina, nedef. sicer ocei = i div 2 kazalčna predstavitev (podatek, kazalec na očeta) (podatek, kazalec na levega in desnega sina) (podatek, kazalec na očeta, kazalec na levega in desnega sina) odvisno od uporabe Predstavitev dvojiških dreves

  8. type drevo = array[1..100] of real; Predstavitev dvojiških dreves d[1] := 1; d[2] := 2; d[3] := 3; d[4] := 4; d[5] := 0; d[6] := 5; d[7] := 6; d[8] := 7; d[9] := 8; d[10] := 0; d[11] := 0; d[12] := 0; d[13] := 9; d[14] := 10; d[15] := 0

  9. d[1] := 1; d[2] := 2; d[3] := 3; d[4] := 4; d[5] := 0; d[6] := 5; d[7] := 6; d[8] := 7; d[9] := 8; d[10] := 0; d[11] := 0; d[12] := 0; d[13] := 9; d[14] := 10; d[15] := 0; stel := 15; write('Indeks elementa '); readln(ind); while (ind <> 0) do begin if (d[ind] = 0) then writeln('Elementa ni v drevesu') else begin if (ind <> 1 ) then writeln( 'Oce elta. ', d[ind], ' je ', d[ind div 2]) else writeln('Element je koren ', d[1], ' in nima oceta'); if ((2 * ind <= stel) and (d[2 * ind] <> 0)) then writeln('Levi sin = ', d[2 * ind]) else writeln('Element nima levega sina'); if ((2 * ind + 1 <= stel) and (d[2 * ind + 1] <> 0)) then writeln('Desni sin = ', d[2 * ind + 1]) else writeln('Element nima desnega sina'); end; write('Indeks elementa '); readln(ind); end drevo1.pas

  10. Predstavitev s kazalci • Najbolj običajno • kazalec na levega sina • vsebina • kazalec na desnega sina type vsebina = integer; { kaj hranimo v drevesu } vozel = record vs: vsebina; ls: ^vozel; ds: ^vozel end; drevo = ^vozel;

  11. write('Koren drevesa '); readln(kor); new(pom); pom^.vs := kor; write('Ali ima ', kor, ' levega sina: 0 - NE 1 - DA '); readln(je_levo); if (je_levo = 1) then begin sestavi(ld); pom^.ls := ld end else pom^.ls := nil; write('Ali ima ', kor, ' desnega sina: 0 - NE 1 - DA '); readln(je_desno); if (je_desno = 1) then begin sestavi(dd); pom^.ds := dd end else pom^.ds := nil; d := pom;

  12. Izpis • v osnovni obliki pri kazalčni predstavitvi težko • kako do nivojev • "prevrnjeno" • koren najbolj levo • desno poddrevo zgoraj, levo spodaj • rekurzija

  13. procedure izpisi(d: drevo; gl: integer); { izpise prevrnjeno drevo z zamikom gl} var i: integer; begin if not(prazno(d))then begin izpisi(d^.ds, gl + 1); writeln(d^.vs: 3*gl); writeln(d^.vs:1); izpisi(d^.ls, gl + 1); end; end;

  14. Pregled dvojiškega drevesa • Obisk vozlišč v določenem vrstnem redu • v globino • po nivojih • po listih, ... • Najpomembnejši: • premi vrstni red: oče, levi sin, desni sin • vmesni vrstni red: levi sin, oče, desni sin • obratni vrstni red: levi sin, desni sin, oče

  15. Pregled dv. drevesa PREMI: 1, 2, 4, 7, 8, 3, 5, 9, 6, 10 VMESNI: 7, 4, 8, 2, 1, 5, 9, 3, 10, 6 OBRATNI: 7, 8, 4, 2, 9, 5, 10, 6, 3, 1

  16. Premi vrstni red • enaka ideja kot pri izpisu • rekurzija procedure oce_prej(k: drevo); begin if (k <> nil) then begin obisci(k); oce_prej(k^.ls); oce_prej(k^.ds); end end;

  17. Rekonstrukcija drevesa • iz dveh pregledov lahko naredimo drevo • PREMI: 1, 2, 4, 7, 8, 3, 5, 9, 6, 10 • VMESNI: 7, 4, 8, 2, 1, 5, 9, 3, 10, 6 • KOREN: 1 • LEVO DREVO V: 7, 4, 8, 2 • LEVO P: 2, 4, 7, 8 • DESNO DREVO V: 5, 9, 3, 10, 6 • DESNO P: 3, 5, 9, 6, 10

  18. Iskalno dvojiško drevo • ni podvojenih elementov • def: dvojiško drevo, za katerega velja, da so vsi elementi v levem poddrevesu, ki je tudi iskalno drevo manjši od korena in v desnem poddrevesu večji od korena. Tudi desno poddrevo je iskalno dv. drevo • Iskanje podatkov je lahko dokaj hitro: odvisno od učinkovitosti predstavitve

  19. Vstavi v iskalno drevo • enako kot pri izpisu, pregledu • rekurzija • če je drevo prazno, vstavimo • če je x < koren, vstavimo desno • če je x > koren, vstavimo levo • če je x = korenu ne naredimo nič

  20. procedure vstavi(var d: drevo; e: vsebina); { vstavi e v urejeno drevo } var k: ^vozel; begin if prazno(d) then begin new(k); k^.vs := e; k^.ls := nil; k^.ds := nil; d := k; end else if d^.vs > e then vstavi(d^.ls, e) else if d^.vs < e then vstavi(d^.ds, e) { ce je ze v drevesu, ga ne vstavimo! } end; vstavi_d.c

More Related