inääripuut ieman lisää aidon binääripuun ominaisuuksia lehtisolmuja on yksi enemmän kuin sisäsolmuja inääripuut tasolla d on korkeintaan 2 d solmua pätee myös epäaidolle binääripuulle taso 0: 2 0 = 1 solmu 4 2 8 1 lehdet++ lehdet++ lehdet sisäsolmut++ pätee jos puussa pelkkä juuri, ja kahden lapsen lisäys lehteen säilyttää tasapainon taso 1: 2 1 = 2 solmua taso 2: 2 2 = 4 solmua taso : 2 = 8 solmua h:n korkuisessa puussa vähintään 1+2h ja enintään 2 h+1 1 solmua Σ h i=0 2i = 2 h+1 1 (induktio: 2 h+1 1 + 2 h+1 = 2 h+2 1) Tietorakenteet, syksy 200 1 Tietorakenteet, syksy 200 2 inääripuut lehtiä vähintään h + 1 ja enintään 2 h n = lehdet + sisäsolmut lehdet = sisäsolmut + 1 1 + 2h n 2 h+1 1 1 + 2h (2 lehdet) 1 2 h+1 1 sisäsolmuja vähintään h ja enintään 2 h 1 n solmuisen aidon binääripuun korkeus h vähintään log(n + 1) 1 ja enintään (n 1)/2 hieman aiemmin: 1 + 2h n 2 h+1 1 Puun alkioiden läpikäynti iten käydä läpi puun alkiot (traversal)? aksi päätyyppiä: leveyssuuntainen (breadth-first) ja syvyyssuuntainen (depth-first) kulku (haku) Tietorakenteet, syksy 200 Tietorakenteet, syksy 200 4
Puun leveyssuuntainen läpikäynti eveyssuuntainen kulku: edetään tasoittain taso 0: taso 1: -- taso 2: ---- taso : ----- Toteutus..? onon avulla Puun leveyssuuntainen läpikäynti S-traversal(T) alusta jono Q Q.nqueue(Root(T)) while Q.spmty() = false do v Q.equeue() prosessoi solmu v for u hildren(v) do Q.nqueue(u) jono Q käydyt...... Tietorakenteet, syksy 200 Tietorakenteet, syksy 200 Syvyyssuuntainen kulku 1. edetään syvemmälle käymättömiin solmuihin, kunnes saavutaan lehteen 2. peruutetaan ylöspäin lähimpään solmuun, jossa vielä käymätön lapsisolmu ( askel 1) -------------------- -------- Tietorakenteet, syksy 200 apset järjestyksessä vasemmalta oikealle tutkiva syvyyssuuntainen kulku vastaa ns. ulerin matkaa (uler tour) koske vasemmalla kädellä juurisolmuun ja kierrä koko puu vastapäivään niin, että käsi koskettaa kokoajan puuta Tietorakenteet, syksy 200 8
Syvyyssuuntaisen kulun toteutus? reitin kulku yksinkertaista rekursiivisesti S-route(v) for u hildren(v) do S-route(u) huom! tässä pelkkä reitti, ei solmujen prosessointia aikavaativuus? (n) Tietorakenteet, syksy 200 Solmujen prosessointi? reitti: ----------------- ----------- sama solmu reitissä useaan kertaan Yleiset tavat: esijärjestys (preorder) ja jälkijärjestys (postorder) Tietorakenteet, syksy 200 10 sijärjestys sijärjestys: solmu käsitellään (siinä käydään ), kun solmuun saavutaan ensimmäistä kertaa (=ylhäältä) Reitti: ----m--m--m-e---a-e-i---b-b-i----c--c-g-i solmu käsitellään: iso kirjain solmun kautta vain kuljetaan: pieni kirjain Tietorakenteet, syksy 200 11 sijärjestys sijärjestyksessä tapahtuvan solmujen käsittelyn toteutus? suoraan ulerin matkan pohjalta (edellä: Sroute) Preorder-traversal(v) for u hildren(v) do Preorder-traversal(u) ainoa muutos: lisättiin alkuun solmun v prosessointi Tietorakenteet, syksy 200 12
sijärjestys simerkki esijärjestyksen sovelluksesta: rakenteisen dokumentin tulostus kirja esipuhe luku 1 luku 2 hakemisto älkijärjestys älkijärjestys: solmu käsitellään (siinä käydään ), kun solmuun tullaan viimeistä kertaa juuri ennen ylöspäin peruuttamista (juurisolmu: kun kaikki lapset jo käsitelty) luku 1.1 luku 1.2 luku 2.1 luku 2.2 Reitti: i-e-m--m--m---e-a----i-b--b--i-g-c--c---- Tietorakenteet, syksy 200 1 Tietorakenteet, syksy 200 14 älkijärjestys älkijärjestyksen toteutus samaan tapaan ulerin matkan pohjalta Postorder-traversal(v) for u hildren(v) do Postorder-traversal(u) ainoa muutos: lisättiin loppuun solmun v prosessointi älkijärjestys simerkki jälkijärjestyksen sovelluksesta: aritmeettisen lausekkeen laskenta = 2 = 0 = + = 1 = + = 8 8 = 0 2 4 (( ) ( + ( ))) ((2 4) + 8) = 0 Tietorakenteet, syksy 200 1 Tietorakenteet, syksy 200 1
Välijärjestys inääripuussa lisäksi: välijärjestys (inorder) solmu v käsitellään sen vasemman alipuun jälkeen, mutta ennen oikeaa alipuuta Reitti: i-e-c----c---e--b----b-i Välijärjestys yös välijärjestyksen toteutus suoraviivaisesti ulerin matkan pohjalta norder-traversal(v) if solmulla v on vasen lapsi then norder-traversal(efthild(v)) if solmulla v on oikea lapsi then norder-traversal(righthild(v)) Tietorakenteet, syksy 200 1 Tietorakenteet, syksy 200 18 Välijärjestys simerkki välijärjestyksen sovelluksesta: binäärihakupuun alkioiden tulostus hakupuun ominaisuus: vasemman alipuun arvot solmun arvo oikean alipuun arvot 8 1 0 2 4 välijärjestyksessä alkiot käsitellään suuruusjärjestyksessä 0, 1, 2,, 4,,,, 8, Tietorakenteet, syksy 200 1