Algoritmit 1 Luento 7 Ti 31.1.2017 Timo Männikkö
Luento 7 Järjestetty binääripuu Binääripuiden termejä Binääripuiden operaatiot Solmun haku, lisäys, poisto Algoritmit 1 Kevät 2017 Luento 7 Ti 31.1.2017 2/30
Binääripuu vasemman alipuun juurisolmu puun juurisolmu oikean alipuun juurisolmu 7 7 Algoritmit 1 Kevät 2017 Luento 7 Ti 31.1.2017 3/30
Binääripuu Solmujen järjestys rakenteen perusteella: Jos solmu a on solmun b vasemmassa alipuussa, niin a b Jos solmu a on solmun b oikeassa alipuussa, niin b a Solmujen järjestys tietosisällön perusteella: Määritellään järjestys solmujen jonkin kentän (tai kenttien) mukaan Voi olla a < b, a > b tai a = b Algoritmit 1 Kevät 2017 Luento 7 Ti 31.1.2017 4/30
Järjestetty binääripuu f b g 7 7 a d c e i h Binääripuu järjestetty, jos kaikilla a ja b on voimassa a b a b Algoritmit 1 Kevät 2017 Luento 7 Ti 31.1.2017 5/30
Binääripuihin liittyviä termejä Solmun vasemman alipuun juurisolmu on solmun vasen lapsi Solmun oikean alipuun juurisolmu on solmun oikea lapsi Solmu on lastensa vanhempi Saman solmun kaksi lasta ovat sisaruksia Solmun edeltäjiä ovat solmun vanhempi, tämän vanhempi jne. Solmun seuraajia ovat solmun lapset, näiden lapset jne. Algoritmit 1 Kevät 2017 Luento 7 Ti 31.1.2017 6/30
Binääripuihin liittyviä termejä Lapseton solmu on lehtisolmu Muut kuin lehtisolmut ovat sisäsolmuja Solmuja yhdistävä viiva on haara, kaari tai oksa Polku solmusta a solmuun b on joukko solmuja v 1 = a, v 2,..., v k 1, v k = b siten, että v i 1 on aina solmun v i vanhempi (tai lapsi) Polun pituus on polulla olevien haarojen lukumäärä Algoritmit 1 Kevät 2017 Luento 7 Ti 31.1.2017 7/30
Binääripuihin liittyviä termejä Solmun syvyys on kyseisestä solmusta juurisolmuun vievän polun pituus Juurisolmun syvyys on 0, sen lapsien syvyys on 1 jne. Solmun taso on juurisolmusta kyseiseen solmuun vievän polun pituus Juurisolmun taso on 0, sen lapsien taso on 1 jne. Solmun korkeus on pisimmän siitä lehtisolmuun vievän polun pituus Puun korkeus on juurisolmun korkeus Algoritmit 1 Kevät 2017 Luento 7 Ti 31.1.2017 8/30
Binääripuun toteutus Taulukolla: Taulukon indeksit toimivat osoittimina solmuihin Tarvitaan tarkat säännöt, jotka kertovat mistä indekseistä lapset ja/tai vanhemmat löytyvät Käyttökelpoinen yleensä vain, jos puurakenne pysyy koko ajan (melkein) samanlaisena (Ei käsitellä) Algoritmit 1 Kevät 2017 Luento 7 Ti 31.1.2017 9/30
Binääripuun toteutus Dynaamisesti: Solmussa osoittimet (linkit, viitteet) molempiin alipuihin, esimerkiksi left ja right Joskus kolmaskin osoitin solmun vanhempaan, jolloin voidaan kulkea helposti myös ylöspäin Osoitin juurisolmuun (vertaa listojen listaosoitin) Esitetään perusoperaatioiden toteutus yleisellä tasolla Algoritmit 1 Kevät 2017 Luento 7 Ti 31.1.2017 10/30
Solmun haku binääripuusta Haetaan solmu, jonka avain on sama kuin annettu hakuavain Tai todetaan, että puussa ei ole sellaista solmua Aloitetaan juurisolmusta Jos hakuavain solmun avain, mennään vasempaan alipuuhun Jos hakuavain > solmun avain, mennään oikeaan alipuuhun Kun vastaan tulee tyhjä alipuu, lopetetaan Algoritmit 1 Kevät 2017 Luento 7 Ti 31.1.2017 11/30
Solmun haku binääripuusta Hakutietue h, osoitin p, ehdokassolmu c 1. Asetetaan p = puun juurisolmu ja c = null 2. Toistetaan kunnes p = null: Jos h.key p.key, asetetaan c = p ja p = p.left Jos h.key > p.key, asetetaan p = p.right 3. Jos c null ja c.key = h.key, niin c on haettu solmu, muuten haettua solmua ei ole puussa Algoritmit 1 Kevät 2017 Luento 7 Ti 31.1.2017 12/30
Solmun haku binääripuusta Algoritmi löytää aina haettavan solmun, jos puussa on sellainen Jos puussa useita solmuja, joilla sama avain kuin hakutietueella, algoritmi löytää niistä rakenteellisessa järjestyksessä ensimmäisen Kuljettujen solmujen jono muodostaa hakupolun Hakupolku päättyy haetun solmun vasemman alipuun rakenteellisessa järjestyksessä viimeiseen solmuun Algoritmit 1 Kevät 2017 Luento 7 Ti 31.1.2017 13/30
Solmun lisääminen binääripuuhun Lisätään solmu avaimen mukaan oikeaan paikkaan Puu pysyy järjestettynä Jos puussa ennestään solmuja, joilla sama avain, uusi solmu lisätään niistä rakenteellisessa järjestyksessä viimeiseksi Järjestys on stabiili Edellinen hakualgoritmi: Löytää rakenteellisessa järjestyksessä ensimmäisen solmun c, jonka avain hakuavain Nyt halutaan: Haetaan rakenteellisessa järjestyksessä viimeinen solmu c, jonka avain hakuavain Edellinen hakualgoritmi peilikuvakseen Algoritmit 1 Kevät 2017 Luento 7 Ti 31.1.2017 14/30
Solmun lisääminen binääripuuhun Uusi solmu u, osoitin p, ehdokassolmu c 1. Alustus: Asetetaan u.left = null ja u.right = null Jos puu on tyhjä, asetetaan u puun juurisolmuksi ja lopetetaan Muuten asetetaan p = puun juurisolmu ja c = null (Algoritmi jatkuu) Algoritmit 1 Kevät 2017 Luento 7 Ti 31.1.2017 15/30
Solmun lisääminen binääripuuhun 2. Toistetaan: Jos u.key < p.key: Jos p.left = null, jatketaan kohdasta 3 Muuten asetetaan p = p.left Jos u.key p.key: Asetetaan c = p Jos p.right = null, jatketaan kohdasta 3 Muuten asetetaan p = p.right (Algoritmi jatkuu) Algoritmit 1 Kevät 2017 Luento 7 Ti 31.1.2017 16/30
Solmun lisääminen binääripuuhun 3. Lopetus: Huom: (Jos puussa ei saa esiintyä yhtäsuuria solmuja ja c null ja c.key = u.key, niin lopetetaan) Jos c = p, asetetaan p.right = u Jos c p, asetetaan p.left = u Jos c = p, silloin myös p.right = null Jos c p, silloin myös p.left = null Molemmissa tapauksissa u tulee rakenteellisessa järjestyksessä c:tä seuraavaksi solmuksi Algoritmit 1 Kevät 2017 Luento 7 Ti 31.1.2017 17/30
Solmun poistaminen binääripuusta Lisääminen tehtiin aina lehtisolmuksi Riittää etsiä lisättävälle solmulle oikea paikka Poistettava solmu voi olla myös sisäsolmu Pitää huolehtia, että poistettavan solmun alipuut pysyvät kiinni puussa Ennen yleisen solmun poistamista pari erikoistapausta Algoritmit 1 Kevät 2017 Luento 7 Ti 31.1.2017 18/30
Ensimmäisen solmun poistaminen Rakenteellisessa järjestyksessä ensimmäinen solmu Poisto yksinkertaisempi kuin yleisen solmun poistaminen Aloitetaan juurisolmusta Kuljetaan jatkuvasti vasemmalle, kunnes tullaan solmuun, jonka vasen alipuu on tyhjä Poistettavan solmun oikea alipuu liitetään poistettavan solmun tilalle Algoritmit 1 Kevät 2017 Luento 7 Ti 31.1.2017 19/30
Ensimmäisen solmun poistaminen Osoitin p ja sen edeltäjä q 1. Alustus: Jos puu ei ole tyhjä, asetetaan p = puun juurisolmu ja q = null 2. Toistetaan: Jos p.left = null, jatketaan kohdasta 3 Muuten asetetaan q = p ja p = p.left 3. Nyt p on puun ensimmäinen solmu, poistetaan p: Jos q = null, on p puun juuri, jolloin asetetaan uudeksi juurisolmuksi p.right Muuten asetetaan q.left = p.right Algoritmit 1 Kevät 2017 Luento 7 Ti 31.1.2017 20/30
Viimeisen solmun poistaminen Vastaavasti, mutta peilikuvana 1. Alustus: Jos puu ei ole tyhjä, asetetaan p = puun juurisolmu ja q = null 2. Toistetaan: Jos p.right = null, jatketaan kohdasta 3 Muuten asetetaan q = p ja p = p.right 3. Nyt p on puun viimeinen solmu, poistetaan p: Jos q = null, on p puun juuri, jolloin asetetaan uudeksi juurisolmuksi p.left Muuten asetetaan q.right = p.left Algoritmit 1 Kevät 2017 Luento 7 Ti 31.1.2017 21/30
Yleisen solmun poistaminen Poistetaan solmu, jonka avain on sama kuin annettu hakuavain Tai todetaan, että puussa ei ole sellaista solmua Jos puussa useita solmuja, joilla sama avain, poistetaan rakenteellisessa järjestyksessä ensimmäinen Järjestys stabiili Periaate: Poistettava solmun tilalle siirretään sen vasemman alipuun viimeinen solmu Algoritmit 1 Kevät 2017 Luento 7 Ti 31.1.2017 22/30
Yleisen solmun poistaminen Edellinen hakualgoritmi: Jos puussa useita solmuja, joilla sama avain kuin hakutietueella, algoritmi löytää niistä rakenteellisessa järjestyksessä ensimmäisen Osoitin c löytää solmun, joka halutaan poistaa (jos sellainen on olemassa) Hakupolku päättyy haetun solmun vasemman alipuun rakenteellisessa järjestyksessä viimeiseen solmuun Osoitin p löytää solmun, joka halutaan siirtää poistettavan solmun tilalle Edellinen hakualgoritmi (ei peilikuvana) Algoritmit 1 Kevät 2017 Luento 7 Ti 31.1.2017 23/30
Yleisen solmun poistaminen Hakutietue h, osoitin p ja sen edeltäjä q, kandidaattisolmu c ja sen edeltäjä c p 1. Alustus: Jos puu ei ole tyhjä, asetetaan p = puun juurisolmu, q = null, c = null ja c p = null (Algoritmi jatkuu) Algoritmit 1 Kevät 2017 Luento 7 Ti 31.1.2017 24/30
Yleisen solmun poistaminen 2. Toistetaan: Jos h.key p.key: Asetetaan c = p ja c p = q Jos p.left = null, jatketaan kohdasta 3 Muuten asetetaan q = p ja p = p.left Jos h.key > p.key: Jos p.right = null, jatketaan kohdasta 3 Muuten asetetaan q = p ja p = p.right (Algoritmi jatkuu) Algoritmit 1 Kevät 2017 Luento 7 Ti 31.1.2017 25/30
Yleisen solmun poistaminen 3. Jos c = null tai c null ja c.key h.key, lopetetaan (solmua ei ole puussa) 4. Poistetaan solmu c: Jos c.left = null, asetetaan p = c.right Muuten: Asetetaan p.right = c.right Jos p c.left (ts. jos q c), asetetaan q.right = p.left ja p.left = c.left (Algoritmi jatkuu) Algoritmit 1 Kevät 2017 Luento 7 Ti 31.1.2017 26/30
Yleisen solmun poistaminen 4. Jatkuu: Kytketään solmu p solmun c tilalle: Jos c on puun juurisolmu, asetetaan uudeksi juurisolmuksi p Muuten asetetaan joko c p.left = p tai c p.right = p, riippuen siitä kumpaan alipuuhun c kuului Algoritmit 1 Kevät 2017 Luento 7 Ti 31.1.2017 27/30
Solmun poistaminen, esimerkki Tapaus: Solmun c vasen alipuu on tyhjä c,p % & p % & Askel 4: p = c.right c p.left=p tai c p.right = p Algoritmit 1 Kevät 2017 Luento 7 Ti 31.1.2017 28/30
Solmun poistaminen, esimerkki Tapaus: Haun jälkeen p on c:n vasen lapsi c p % & p % & Askel 4: p.right = c.right c p.left = p tai c p.right = p Algoritmit 1 Kevät 2017 Luento 7 Ti 31.1.2017 29/30
Solmun poistaminen, esimerkki Tapaus: Haun jälkeen p ei ole c:n vasen lapsi c q & % p # p q & % # Askel 4: p.right = c.right c p.left = p q.right = p.left tai p.left = c.left c p.right = p Algoritmit 1 Kevät 2017 Luento 7 Ti 31.1.2017 30/30