Puurakenteet
Transcription
Puurakenteet
Tietorakenteet ja algoritmit Puurakenteet Ari Korhonen 13.10.2015 Tietorakenteet ja algoritmit 1 7. PUURAKENTEET 7.1 Käsitteistöä 7.2 Binääripuu (binary tree) 7.3 Puiden esitys- ja toteutustapoja 7.4 Puussa kulkeminen (traversing a tree) 7.5 Puiden sovelluksia 13.10.2015 Tietorakenteet ja algoritmit 2 7.1 § Käsitteistöä Puurakenteen perusmalli on sukupuu ylös A juuri (root) alas B D 13.10.2015 C H G L Tietorakenteet ja algoritmit isä (parent) lapsi (child) 3 Käsitteitä ja ominaisuuksia: § Solmu (node, vertex) on puuhun kuuluva alkio, johon voidaan tallettaa tietoa § Särmä, kaari (edge, arc) on suora yhteys kahden solmun välillä § Juuri (root) on puun ylin solmu § Solmun lähin edeltäjä on sen isä (father, dad, parent). Kauemmista edeltäjistä käytetään nimeä isoisä, esi-isä tai edeltäjä (grandfather, ancestor) § Solmun lähinnä alemmat seuraajat ovat sen lapsia (children). Näiden lapset vastaavasti lapsenlapsia (grandchildren) § Kullakin solmulla on vain yksi isä § ylös juuri (root) alas Juurella ei ole isää B D 13.10.2015 A Tietorakenteet ja algoritmit C H G L isä (parent) lapsi (child) 4 § Solmulla voi olla 0-N kpl lapsia. Yleisessä puussa lasten määrää ei ole rajoitettu § Saman isän lapset ovat toistensa sisaruksia (sibling) § Lehti (leaf, external node) on solmu, jolla ei ole lapsia § Muut solmut ovat puun sisäsolmuja (internal node) § Lehdet ovat joskus rakenteeltaan erilaisia kuin sisäsolmut § Polku (path) on yhteys kahden solmun välillä § Juuresta mihin tahansa solmuun on vain yksi polku. Vastaavasti jokaisesta solmusta on vain yksi polku mihin tahansa toiseen solmuun. Puussa ei ole silmukoita. § Jokainen solmu on oman alipuunsa (subtree) juuri § 13.10.2015 Puiden joukko on metsä (forest) Tietorakenteet ja algoritmit ylös A juuri (root) alas B D C H G L isä (parent) lapsi (child) 5 § Järjestetyssä puussa (ordered tree) lasten järjestys on määrätty • Vasen, Oikea • Ensimmäinen, Toinen,...,Viimeinen • Järjestys liittyy puun rakenteeseen. Se EI tarkoita sitä että solmuihin liittyvä tieto olisi järjestyksessä! § Solmu on tasolla N (level N), jos polulla siitä juureen on N solmua. Juuren taso on 0. § Puun korkeus (height) on sen tasojen määrä, ts. pisimmän juuresta lehteen ulottuvan polun pituus ylös A juuri (root) alas B D 13.10.2015 Tietorakenteet ja algoritmit C H G L isä (parent) lapsi (child) 6 Lause: Jos puussa on N solmua niin siinä on N-1 särmää Todistus: § Jokainen solmu kytkeytyy yhdellä särmällä isäsolmuunsa § Juurisolmulla ei ole isää Puun rekursiivinen määritelmä: § Puu on joko yksittäinen solmu tai juurisolmu, joka on kytketty joukkoon muita puita (= alipuita ) ylös § Alipuiden tulee olla pareittain pistevieraita A alas B D 13.10.2015 Tietorakenteet ja algoritmit juuri (root) C H G L isä (parent) lapsi (child) 7 § Usein käytetty merkintä: • Solmut palloja • Alipuut kolmioita P U U K4.2 A l i puu A l i puu 13.10.2015 Tietorakenteet ja algoritmit 8 7.2 § § § 13.10.2015 Binääripuu (binary tree) Hyvin tärkeä puiden perustyyppi. Binääripuu (binary tree) on järjestetty puu, jossa jokaisella solmulla on täsmälleen kaksi lasta: vasen ja oikea (voivat olla tyhjiä) Binääripuu on täydellinen (complete), jos alinta tasoa lukuunottamatta kaikki tasot ovat täynnä ja alimmalla tasolla solmut ovat vasemmassa reunassa Tietorakenteet ja algoritmit 9 7.3 Puiden esitys- ja toteutustapoja 7.3.1 Dynaaminen tietorakenne struct node { char key; struct node *left; struct node *right; }; key left right typedef struct node * link; § 13.10.2015 Lehtisolmujen linkit voidaan asettaa arvoon NULL, joskin erillisen Z-solmun käyttö on parempi ratkaisu Tietorakenteet ja algoritmit 10 Sama Javalla class TreeNode { private Object data; private TreeNode left, right; TreeNode (Object element) { data = element; left = null; right = null; } } TreeNode root, p, q; 13.10.2015 Tietorakenteet ja algoritmit 11 § Joskus juuren käsittely joudutaan suorittamaan erikoistapauksena • § Esim. jos kaikkiin solmuihin kohdistettava operaatio viittaa myös solmun isään Kannattaa määritellä ylimääräinen Head-solmu, josta on viittaus juureen • Vrt. linkitetty lista H ea d K4.4 13.10.2015 Tietorakenteet ja algoritmit 12 § Samoin voidaan määritellä erityinen z-solmu, johon tyhjät alipuut eli lehtisolmujen linkit viittaavat (Sedgewick: Algorithms) : H ea d • z-solmuja on vain yksi kappale • z-solmun linkit viittaavat z-solmuun itseensä • K4.5 Kaikki kerralla käytössä olevat dynaamiset tietorakenteet voivat käyttää samaa z-solmua Z 13.10.2015 Tietorakenteet ja algoritmit 13 § Nyt esim voidaan luoda tyhjä puu ja käsitellä sitä samoilla rutiineilla kuin muitakin puita: link Z = malloc(sizeof(struct node)); Z->left = Z; Z->right = Z; H ea d link Head = malloc(sizeof(struct node)); Head->left = Z; Head->right = Z; 13.10.2015 Tietorakenteet ja algoritmit K4.6 Z 14 § Tämä esitystapa mahdollistaa liikkumisen puussa vain alaspäin § Jos halutaan liikkua myös ylös, voidaan lisätä kolmas linkki, dad, joka osoittaa solmun isään class TreeNode { private Object data; private TreeNode left, right, dad; TreeNode (Object element) { data = element; left = null; right = null; dad = null; } } 13.10.2015 Tietorakenteet ja algoritmit 15 Luentotehtävä 1. Jos binääripuussa on N (ei-tyhjää) alkiota eli solmua, niin mikä on sen korkeus a) enintään? b) vähintään? 2. Jos binääripuun korkeus on k, niin kuinka monta alkiota siinä on a) enintään? b) vähintään? 13.10.2015 Tietorakenteet ja algoritmit 16 7.3.2 § § § § § § 13.10.2015 Taulukkoesitys Täydellinen binääripuu voidaan esittää yksinkertaisessa taulukossa (muille binääripuille näin ei voi tehdä) Juuri on taulukon 1. alkiossa Paikassa k olevan solmun isä on paikassa k DIV 2 Paikassa k olevan solmun lapset ovat paikoissa 2*k ja 2*k+1 Viittauksille lapsiin (left, right) ei siis varata lainkaan tilaa Esityksessä voi liikkua sekä ylös että alas puussa Tietorakenteet ja algoritmit 17 7.3.3 § Isä-linkit tai -taulukko yleiselle puulle Jos puussa tarvitsee liikkua vain ylöspäin, riittää kussakin solmusta tieto sen isästä. Tämä voidaan toteuttaa joko dynaamisena tietorakenteena tai taulukkona. A struct node { char key; struct node *dad; }; R A S 13.10.2015 P 2 3 4 5 6 7 8 9 10 S A M P L E T R E E! 3 10 8 8 8 8 9 10 -1 10! Tietorakenteet ja algoritmit E T M typedef struct node * link; k ! !1 ! a[k] !A ! dad[k]!3 E L E 11 ! 18 § Jos yleisessä puussa halutaan liikkua alaspäin, kytketään kunkin solmun jälkeläiset linkitetyksi listaksi. Siten voidaan varata tilaa tarpeen mukaan. § Solmusta on osoitin vasemman puolimmaiseen lapseen ja lähinnä oikealla olevaan veljeen E A A R S E T struct node { char key; struct node *First_child; struct node *Next_sibling; }; typedef struct node * link; M P L E => Esitysmuoto palautuu binääripuuksi! 13.10.2015 Tietorakenteet ja algoritmit 19 7.4 Puussa kulkeminen (traversing a tree) § Monessa tilanteessa pitää pystyä käymään läpi (traverse) kaikki puussa olevat alkiot § Läpikäyntijärjestyksiä on useita 13.10.2015 • esijärjestys (preorder) • sisäjärjestys (inorder) • jälkijärjestys (postorder) • tasojärjestys (level order) Tietorakenteet ja algoritmit 20 § Esijärjestyksessä puu käydään rekursiivisesti läpi järjestyksessä: juuri - vasen alipuu - oikea alipuu PM SAALE R T E E § Sisäjärjestyksessä puu käydään rekursiivisesti läpi järjestyksessä: vasen alipuu - juuri - oikea alipuu ASAMPLETREE P M E S A L A R T E E 13.10.2015 Tietorakenteet ja algoritmit 21 § Jälkijärjestyksessä puu käydään rekursiivisesti läpi järjestyksessä: vasen alipuu - oikea alipuu – juuri AAS M T E E R E LP § Tasojärjestyksessä puu käydään läpi ylhäältä alaspäin kukin taso kerrallaan vasemmalta oikealle PM LS EAAR T E E P M E S A L A R T E E 13.10.2015 Tietorakenteet ja algoritmit 22 “Muistisääntö”: § Piirretään viiva juuren päältä lähtien vastapäivään puun ympäri läheltä liipaten, tulostetaan solmu kun se • • • ohitetaan vasemmalta ohitetaan alta ohitetaan oikealta => Esijärjestys => Sisäjärjestys => Jälkijärjestys P M E S A L A R T E E 13.10.2015 Tietorakenteet ja algoritmit 23 § Kolmen ensimmäisen läpikäyntitavan implementaatio on helpointa tehdä rekursion avulla P void traverse_preorder(link t) { if (t != NULL) { visit(t); traverse_preorder(t->left); traverse_preorder(t->right); } } • 13.10.2015 M E S A L A R T E E Osoitinmuuttujan t rooli läpikäyntialgoritmeissa on kulkija. Kentät t>left ja t->right ovat kiintoarvoja. Tietorakenteet ja algoritmit 24 void traverse_inorder(link t) { if (t != NULL) { traverse_inorder(t->left); visit(t); traverse_inorder(t->right); S } } A void traverse_postorder(link t) { if (t != NULL) { traverse_postorder(t->left); traverse_postorder(t->right); visit(t); } } 13.10.2015 Tietorakenteet ja algoritmit P M L E A R T E E 25 Esijärjestys pinon avulla: Tasojärjestyksen implementointi käy helposti jonorakenteen avulla: void void traverse_levelorder(link t) traverse_preorder(link t) { { put(t); push(t); do { do { t = get(); t = pop(); if (t != NULL) { if (t != NULL) { visit(t); visit(t); put(t->left); push(t->right); put(t->right); push(t->left); } } } while (!queue_empty()); } while (!stack_empty()); } } P M E S A L A R T E E Operaatiot push() ja pop() kohdistuvat pinoon, jonka rooli on säiliö. 13.10.2015 Tietorakenteet ja algoritmit 26 Luentotehtävä • Esitä jonon sisältö, kun oheinen puu käydään läpi tasojärjestyksessä annetulla algoritmilla P • M L Parityöskentely sallittua! E S void traverse_levelorder(link t) { A A R put(t); do { T E t = get(); if (t != NULL) { E visit(t); put(t->left); Esitä jonon sisältö jokaisen iteraation alussa: put(t->right); P } M L } while (!queue_empty()); L S } … 13.10.2015 Tietorakenteet ja algoritmit 27 Luentotehtävä Esitä jonon sisältö, kun oheinen puu käydään läpi tasojärjestyksessä annetulla algoritmilla void traverse_levelorder(link t) { put(t); do { t = get(); if (t != NULL) { visit(t); put(t->left); put(t->right); } } while (!queue_empty()); } P • 13.10.2015 M E S A A P M L L S S E E A A A A R A R R T E E E P M L S E A A R T E E Tietorakenteet ja algoritmit L R T E E 28 § Yleisen puun läpikäynnissä em. algoritmit yleistetään E A A Esijärjestys R S E EAAS R T M PLE E Jälkijärjestys T ASAMPLETREE M § § 13.10.2015 P L E Sisäjärjestys ei ole yksiselitteinen. Esim. juuri lasketaan 1. lapsen jälkeen, mutta toteutus voisi olla toinenkin. Koska yleinen puu on palautettavissa binääripuuksi, sitä koskevat algoritmit voidaan yleistää binääripuun käsittelyalgoritmeista. Tietorakenteet ja algoritmit 29 7.4.1 § § § 13.10.2015 Eräitä läpikäynnin sovelluksia: Esijärjestys • sisällysluettelon tulostaminen • tiedostoluettelon tulostaminen Sisäjärjestys • hakupuun sisältö aakkostettuna • lauseke infix-muodossa Jälkijärjestys • tulosyhteenveto • lauseke postfix-muodossa Tietorakenteet ja algoritmit 30 7.4.2 § Läpikäyntijärjestyksen merkityksiä Esijärjestys vastaa depth first-hakua “etsitään tietty haara mahdollisimman pitkälle ennen kuin peräännytään” § Tasojärjestys vastaa breadth first –hakua “etsitään tietyllä etäisyydellä juuresta olevia solmuja.” • 13.10.2015 Näihin palataan verkkoalgoritmien yhteydessä kurssin lopussa. Tietorakenteet ja algoritmit 31 7.5 Puiden sovelluksia 7.5.1 Jäsennyspuu. Esimerkiksi lauseke voidaan esittää puurakenteen avulla § Alkuperäinen infix-lauseke: 5 * ( ( 9 + 8 ) * (4 + 6) + 7 ) § Kun tämä puu käydään läpi jälkijärjestyksessä, saadaan lauseke postfix-muodossa : + 598+46+*7+* 13.10.2015 Tietorakenteet ja algoritmit 32 § Sisäjärjestys antaa lausekkeen alkuperäisessä infixmuodossa, kunhan sulut lisätään yhteenlaskusolmujen oikeille puolille 5*((9+8)*(4+6)+7) § Esijärjestys antaa ns. prefix-muodon *5+*+98+467 13.10.2015 Tietorakenteet ja algoritmit 33 Jäsennyspuun luominen: 1. Luetaan postfix-lauseketta merkki kerrallaan 598+46+*7+* 2. 3. 13.10.2015 Operandi => • Tehdään tästä uuden puun juuri • Osoitin uuteen puuhun asetetaan pinoon Operaattori => • Tehdään tästä uuden puun juuri • Oikeaksi lapseksi popataan pinon päällimmäinen • Vasemmaksi lapseksi seuraava • Osoitin uuteen puuhun pinoon Tietorakenteet ja algoritmit 34 Esim: 5 9 K4.10a 5 5 9 + 8 5 9 8 5 + 9 13.10.2015 Tietorakenteet ja algoritmit 8 35 4 6 5 5 4 9 8 + 8 * 5 5 + 9 13.10.2015 6 + + 9 4 + 8 4 * + 6 Tietorakenteet ja algoritmit 9 + 8 4 6 36 + 7 5 5 7 * 13.10.2015 + 8 7 * + 9 + 4 + 6 9 Tietorakenteet ja algoritmit + 8 4 6 37 * * 5 + 7 * + 9 13.10.2015 + 8 4 6 Tietorakenteet ja algoritmit 38 Puista lisää ensi kerralla: 7.5.2 • Binäärinen hakupuu Tieto voidaan järjestää puuhun siten, että haku on nopeaa. Esimerkki: binäärinen hakupuu (binary search tree) K E C S G R A J U T X I 13.10.2015 Tietorakenteet ja algoritmit 39 7.5.3 Keko • Tieto voidaan järjestää puuhun siten, että suurimman (pienimmän) alkion etsiminen on nopeaa. • Keko on tärkeä prioriteettijono (itseopiskeluasiaa) • Toteutus kuitenkin taulukkona! X T O G A 13.10.2015 S E R M A N I Tietorakenteet ja algoritmit 40