Kaikki mitä sinun tarvitsee tietää puiden tietorakenteista

Puut ovat niin kauniita. Piirroksen, jonka tein nuorena poikana.

Kun oppit ensimmäistä kertaa koodaamaan, on yleistä oppia taulukot ”päädatarakenteeksi”.

Lopulta opit myös hash-taulukoista. Jos haet tietotekniikan tutkintoa, sinun on otettava luokka tietorakenteesta. Opit myös linkitetyistä luetteloista, jonoista ja pinoista. Näitä tietorakenteita kutsutaan ”lineaarisiksi” tietorakenteiksi, koska niillä kaikilla on looginen alku ja looginen loppu.

Kun alamme oppia puita ja kuvaajia, se voi tulla todella hämmentävä. Emme tallenna tietoja lineaarisella tavalla. Molemmat tietorakenteet tallentavat tietoja tietyllä tavalla.

Tämän viestin tarkoituksena on auttaa sinua ymmärtämään paremmin puutietojen rakennetta ja selventämään mahdollisia sekaannuksia, joita sinulla voi olla siitä.

Tässä artikkelissa opitaan:

  • Mikä on puu
  • Esimerkkejä puista
  • Sen terminologia ja miten se toimii
  • Kuinka toteuttaa puurakenteet koodissa.

Aloitetaan tämä oppimatka. :)

Määritelmä

Ohjelmointia aloitettaessa on yleistä ymmärtää paremmin lineaariset tietorakenteet kuin tietorakenteet, kuten puut ja kaaviot.

Puut tunnetaan hyvin epälineaarisena tietorakenteena. He eivät tallenna tietoja lineaarisella tavalla. He järjestävät tiedot hierarkkisesti.

Sukellaan tosielämän esimerkkeihin!

Mitä tarkoitan, kun sanon hierarkkisesti?

Kuvittele sukupuu, jolla on suhteita kaikesta sukupolvesta: isovanhemmat, vanhemmat, lapset, sisarukset jne. Järjestämme sukupuut yleensä hierarkkisesti.

Sukupuuni

Yllä oleva piirustus on sukupuuni. Tossico, Akikazu, Hitomi ja Takemi ovat isovanhempani.

Toshiaki ja Juliana ovat vanhempani.

TK, Yuji, Bruno ja Kaio ovat vanhempieni lapset (minä ja veljeni).

Organisaation rakenne on toinen esimerkki hierarkiasta.

Yrityksen rakenne on esimerkki hierarkiasta

HTML-muodossa asiakirjaobjektimalli (DOM) toimii puuna.

Asiakirjaobjektimalli (DOM)

HTML-tunniste sisältää muita tunnisteita. Meillä on päälaki ja vartalolappu. Nämä tunnisteet sisältävät tiettyjä elementtejä. Otsakkeessa on meta- ja otsikkotunnisteet. Rungotunnisteessa on elementtejä, jotka näkyvät käyttöliittymässä, esimerkiksi h1, a, li jne.

Tekninen määritelmä

Puu on kokoelma kokonaisuuksia, joita kutsutaan solmuiksi. Solmut yhdistetään reunoilla. Jokainen solmu sisältää arvon tai datan, ja sillä voi olla lapsisolmu tai ei.

Puun ensimmäistä solmua kutsutaan juuri. Jos tämä juurisolmu yhdistetään toisella solmulla, juuri on sitten vanhemmasolmu ja kytketty solmu on lapsi.

Kaikki puusolmut yhdistetään linkkillä, joita kutsutaan reunoiksi. Se on tärkeä osa puita, koska se hallitsee solmujen välistä suhdetta.

Lehdet ovat puun viimeiset solmut. Ne ovat solmuja, joilla ei ole lapsia. Kuten oikeat puut, meillä on juuri, oksat ja lopulta lehdet.

Muita tärkeitä ymmärrettäviä käsitteitä ovat korkeus ja syvyys.

Puun korkeus on pisimmän polun leveys.

Solmun syvyys on polun pituus sen juureen.

Termiyhteenveto

  • Juuri on puun ylin solmu
  • Reuna on linkki kahden solmun välillä
  • Lapsi on solmu, jolla on ylätaso
  • Vanhempi on solmu, jolla on reuna ala-solmuun
  • Lehti on solmu, jolla ei ole lapsisolmua puussa
  • Korkeus on pisimmän reitin leveys
  • Syvyys on polun pituus juureensa

Binaaripuut

Nyt keskustelemme tietyntyyppisestä puusta. Kutsumme sitä binaariseksi puuksi.

"Tietotekniikassa binaarinen puu on puun tietorakenne, jossa jokaisella solmulla on korkeintaan kaksi lasta, joista viitataan vasemmalla ja oikealla lapsella." - Wikipedia

Katsotaanpa esimerkkiä binaaripuusta.

Koodataan binaaripuu

Ensimmäinen asia, joka meidän on pidettävä mielessä binääristä puuta toteutettaessa, on, että se on solmujen kokoelma. Jokaisella solmulla on kolme ominaisuutta: arvo, vasen_lapset ja oikea_lapset.

Kuinka toteutamme yksinkertaisen binaaripuun, joka alkaa näillä kolmella ominaisuudella?

Katsotaanpa.

Tässä se on. Binaarinen puuklassamme.

Kun välitämme objektia, välitämme arvon (solmun tiedot) parametrina. Katso vasenta ja oikeaa lasta. Molemmat asetetaan arvoon Ei mitään.

Miksi?

Koska solmupistettä luomalla sillä ei ole lapsia. Meillä on vain solmun tiedot.

Testattava se:

Se siitä.

Voimme välittää merkkijonon 'a' arvona binaaripuu-solmulle. Jos tulostamme arvot vasemmalle ja oikealle lapselle, näemme arvot.

Mennään lisäysosaan. Mitä meidän on tehtävä täällä?

Toteutamme menetelmän uuden solmun lisäämiseksi oikealle ja vasemmalle.

Tässä ovat säännöt:

  • Jos nykyisellä solmulla ei ole vasenta lasta, me vain luomme uuden solmun ja asetamme sen nykyisen solmun vasemmanpuoleiseksi lapseksi.
  • Jos siinä on vasen lapsi, luomme uuden solmun ja laitamme sen nykyiseen vasemman lapsen paikkaan. Osoita tämä vasen lapsisolmu uuden solmun vasemmalle lapselle.

Piirrämme sen ulos. :)

Tässä on koodi:

Jälleen, jos nykyisellä solmulla ei ole vasenta lasta, me vain luomme uuden solmun ja asetamme sen nykyisen solmun vasemmalle lapselle. Tai muuten luomme uuden solmun ja laitamme sen nykyiseen vasempaan lapsen paikkaan. Osoita tämä vasen lapsisolmu uuden solmun vasemmalle lapselle.

Ja teemme saman asian lisätäksemme oikean lapsisolmun.

Tehty. :)

Mutta ei kokonaan. Meidän on vielä testattava se.

Rakennetaan seuraava trendi:

Yhteenvetona tämän puun esimerkistä:

  • solmu on binaaripuun juuri
  • vasen lapsi on b-solmu
  • oikea lapsi on c-solmu
  • b oikea lapsi on d solmu (b solmulla ei ole vasenta lasta)
  • c vasen lapsi on e-solmu
  • c oikea lapsi on f solmu
  • Sekä e- että f-solmulla ei ole lapsia

Joten tässä on puun koodi:

Lisäys on tehty.

Nyt meidän on ajateltava puiden kulkemista.

Meillä on täällä kaksi vaihtoehtoa: syvyys-ensimmäinen haku (DFS) ja leveys-ensimmäinen haku (BFS).

  • DFS “on algoritmi puun tietorakenteen siirtämiseen tai etsimiseen. Yksi alkaa juuresta ja tutkitaan niin pitkälle kuin mahdollista jokaista haaraa pitkin ennen taaksepäin vetämistä. ”- Wikipedia
  • BFS ”on algoritmi puun tietorakenteen siirtämiseen tai etsimiseen. Se alkaa puun juuresta ja tutkii ensin naapurisolmuja ennen siirtymistä seuraavalle tasolle naapureille. ”- Wikipedia

Sukellaan siis jokaiseen puun kulkutyyppiin.

Ensimmäinen syvyyshaku (DFS)

DFS tutkii polkua aina lehtiin, ennen kuin palaa taaksepäin ja etsii toista polkua. Katsotaanpa esimerkkiä tämän tyyppisestä läpikulusta.

Tämän algoritmin tulos on 1–2–3–4–5–6–7.

Miksi?

Hajotamme sen.

  1. Aloita juuresta (1). Tulosta se.

2. Mene vasemman lapsen kohdalle (2). Tulosta se.

3. Siirry sitten vasen lapsi (3). Tulosta se. (Tällä solmulla ei ole lapsia)

4. Takaistu ja mene oikea lapsi (4). Tulosta se. (Tällä solmulla ei ole lapsia)

5. Takaisin juurisolmulle ja mene oikealle lapselle (5). Tulosta se.

6. Mene vasemman lapsen luo (6). Tulosta se. (Tällä solmulla ei ole lapsia)

7. Takaistu ja mene oikealle lapselle (7). Tulosta se. (Tällä solmulla ei ole lapsia)

8. Valmis.

Kun siirrymme syvälle lehtiin ja takaisin, seuraavaa kutsutaan DFS-algoritmiksi.

Nyt kun olemme perehtyneet tähän läpikulkualgoritmiin, keskustelemme DFS: n tyypeistä: ennakkotilaus, tilaus ja jälkitilaus.

Ennakkotilaus

Juuri tämän teimme yllä olevassa esimerkissä.

  1. Tulosta solmun arvo.
  2. Mene vasemman lapsen luo ja tulosta se. Tällöin ja vain jos sillä on vasen lapsi.
  3. Mene oikealle lapselle ja tulosta se. Tällöin ja vain jos sillä on oikea lapsi.

Järjestyksessä

Tämän puu-esimerkin järjestyksessä olevan algoritmin tulos on 3–2–4–1–6–5–7.

Vasen ensimmäinen, keskimmäinen sekunti ja oikea viimeinen.

Nyt koodataan se.

  1. Mene vasemman lapsen luo ja tulosta se. Tällöin ja vain jos sillä on vasen lapsi.
  2. Tulosta solmun arvo
  3. Mene oikealle lapselle ja tulosta se. Tällöin ja vain jos sillä on oikea lapsi.

Post-tilaus

Tämän puumallin jälkitilausalgoritmin tulos on 3–4–2–6–7–5–1.

Vasen ensimmäinen, oikea toinen ja keskimmäinen.

Koodataan tämä.

  1. Mene vasemman lapsen luo ja tulosta se. Tällöin ja vain jos sillä on vasen lapsi.
  2. Mene oikealle lapselle ja tulosta se. Tällöin ja vain jos sillä on oikea lapsi.
  3. Tulosta solmun arvo

Leveys-ensimmäinen haku (BFS)

BFS-algoritmi kulkee puun tasolla tason ja syvyyden syvyyden mukaan.

Tässä on esimerkki, joka auttaa selittämään tätä algoritmia paremmin:

Joten me kuljemme tasolta tasolle. Tässä esimerkissä tulos on 1–2–5–3–4–6–7.

  • Taso / syvyys 0: vain solmu, jonka arvo on 1
  • Taso / syvyys 1: solmut arvoilla 2 ja 5
  • Taso / syvyys 2: solmut arvoilla 3, 4, 6 ja 7

Nyt koodataan se.

BFS-algoritmin toteuttamiseksi apuna käytetään jonotietorakennetta.

Kuinka se toimii?

Tässä selitys.

  1. Lisää ensin juurisolmu jonoon put-menetelmällä.
  2. Toista, kun jono ei ole tyhjä.
  3. Hanki jonon ensimmäinen solmu ja tulosta sen arvo.
  4. Lisää sekä vasen että oikea lapsi jonossa (jos nykyiset solmut ovat lapsia).
  5. Tehty. Tulostamme kunkin solmun arvon tasolta tasolle jonojärjestelmämme avulla.

Binaarinen hakupuu

"Binaarista hakupuuta kutsutaan joskus tilattuiksi tai lajiteltuiksi binaaripuiksi, ja se pitää arvot lajiteltuina järjestyksessä, jotta haku ja muut toiminnot voivat käyttää binaarisen haun periaatetta" - Wikipedia

Binaarisen hakupuun tärkeä ominaisuus on, että binaarisen hakupuun solmun arvo on suurempi kuin sen vasemman lapsen jälkeläisten arvo, mutta pienempi kuin sen oikean lapsen jälkeläisten arvo. "

Tässä on erittely yllä olevasta kuvasta:

  • A on käänteinen. Alapalkkien 7–5–8–6 on oltava oikealla puolella ja alapuun 2–1–3 on oltava vasemmalla.
  • B on ainoa oikea vaihtoehto. Se täyttää binaarisen hakupuun ominaisuuden.
  • C: llä on yksi ongelma: solmu, jonka arvo on 4. Sen on oltava juuren vasemmalla puolella, koska se on pienempi kuin 5.

Koodataan binaarinen hakupuu!

Nyt on aika koodata!

Mitä näemme täällä? Lisäämme uusia solmuja, etsimme arvoa, poistamme solmut ja puun tasapainon.

Aloitetaan.

Lisäys: uusien solmujen lisääminen puuomme

Kuvittele, että meillä on tyhjä puu ja haluamme lisätä uusia solmuja seuraavilla arvoilla tässä järjestyksessä: 50, 76, 21, 4, 32, 100, 64, 52.

Ensimmäinen asia, joka meidän on tiedettävä, onko 50 puumme juuri.

Voimme nyt aloittaa solmun lisäämisen solmun mukaan.

  • 76 on suurempi kuin 50, joten aseta 76 oikealle puolelle.
  • 21 on pienempi kuin 50, joten aseta 21 vasemmalle puolelle.
  • 4 on pienempi kuin 50. Solmulla, jonka arvo on 50, on vasen lapsi 21. Koska 4 on pienempi kuin 21, aseta se tämän solmun vasemmalle puolelle.
  • 32 on pienempi kuin 50. Solmulla, jonka arvo on 50, on vasen lapsi 21. Koska 32 on suurempi kuin 21, aseta 32 tämän solmun oikealle puolelle.
  • 100 on suurempi kuin 50. Solmulla, jonka arvo on 50, on oikea lapsi 76. Koska 100 on suurempi kuin 76, aseta 100 tämän solmun oikealle puolelle.
  • 64 on suurempi kuin 50. Solmulla, jonka arvo on 50, on oikea lapsi 76. Koska 64 on pienempi kuin 76, aseta 64 tämän solmun vasemmalle puolelle.
  • 52 on suurempi kuin 50. Solmulla, jolla on arvo 50, on oikea lapsi 76. Koska 52 on pienempi kuin 76, solmulla, jolla on arvo 76, on vasen lapsi 64. 52 on pienempi kuin 64, joten aseta 54 tämän solmun vasemmalle puolelle.

Huomaatko täällä kuvion?

Hajotamme sen.

  1. Onko uuden solmun arvo suurempi vai pienempi kuin nykyinen solmu?
  2. Jos uuden solmun arvo on suurempi kuin nykyinen solmu, siirry oikeaan alaosaan. Jos nykyisellä solmulla ei ole oikeaa lasta, aseta se sinne tai palaa takaisin vaiheeseen 1.
  3. Jos uuden solmun arvo on pienempi kuin nykyinen solmu, siirry vasempaan alaosaan. Jos nykyisellä solmulla ei ole vasenta lasta, aseta se sinne tai palaa takaisin vaiheeseen 1.
  4. Emme käsitelleet erityistapauksia täällä. Kun uuden solmun arvo on yhtä suuri kuin solmun nykyinen arvo, käytä sääntöä numero 3. Harkitse lisäämällä yhtä suuret arvot alaosan vasemmalle puolelle.

Nyt koodataan se.

Se näyttää hyvin yksinkertaiselta.

Tämän algoritmin voimakas osa on rekursio-osa, joka on linjalla 9 ja rivillä 13. Molemmat koodirivit kutsuvat insert_node -menetelmää ja käyttävät sitä vastaavasti vasemmalle ja oikealle lapselle. Rivit 11 ja 15 lisäävät jokaiselle lapselle.

Etsitään solmun arvoa ... Tai ei ...

Nyt rakennettava algoritmi koskee hakujen tekemistä. Tietyn arvon (kokonaisluku) kohdalla sanotaan, onko binaarisella hakupuulla kyseinen arvo vai ei.

Tärkeä huomioitava kohta on se, kuinka määrittelimme puun lisäysalgoritmin. Ensin on juurisolmu. Kaikilla vasemmalla olevilla osapuun solmilla on pienemmät arvot kuin juurisolmulla. Ja kaikilla oikeilla subreece-solmuilla on arvot, jotka ovat suurempia kuin juurisolmu.

Katsotaanpa esimerkkiä.

Kuvittele, että meillä on tämä puu.

Nyt haluamme tietää, onko meillä arvoon 52 perustuva solmu.

Hajotamme sen.

  1. Aloitamme juurisolmusta nykyisenä solmuna. Onko annettu arvo pienempi kuin nykyinen solmun arvo? Jos kyllä, niin etsimme sitä vasemmasta alaruudusta.
  2. Onko annettu arvo suurempi kuin nykyinen solmun arvo? Jos kyllä, niin etsimme sitä oikealta alaruudulta.
  3. Jos säännöt 1 ja 2 ovat molemmat vääriä, voimme verrata nykyistä solmun arvoa ja annettua arvoa, jos ne ovat yhtä suuret. Jos vertailu tuottaa paikkansa, voimme sanoa: ”Kyllä! Puumme on antanut arvon ", muuten sanomme:" Nooo, se ei ole. "

Nyt koodataan se.

Olkaamme nokka koodi:

  • Rivit 8 ja 9 kuuluvat säännön # 1 soveltamisalaan.
  • Rivit 10 ja 11 kuuluvat säännön nro 2 piiriin.
  • Rivi 13 kuuluu säännön # 3 soveltamisalaan.

Kuinka testaamme sitä?

Luodaan binaarinen hakupuu alustamalla juurisolmu arvolla 15.

Ja nyt lisäämme monia uusia solmuja.

Jokaiselle lisätylle solmulle testataan, toimiiko find_node-menetelmä todella.

Joo, se toimii näille annettuille arvoille! Testataan arvo, jota ei ole binaarisessa hakupuussa.

Todellakin.

Haku on tehty.

Poisto: poistaminen ja järjestäminen

Poisto on monimutkaisempi algoritmi, koska meidän on käsiteltävä erilaisia ​​tapauksia. Annetulle arvolle on poistettava solmu, jolla on tämä arvo. Kuvittele seuraavat solmukohdat tälle solmulle: siinä ei ole lapsia, sillä on yksi lapsi tai kaksi lasta.

  • Skenaario # 1: Solmu, jolla ei ole lapsia (lehtisolmu).

Jos poistettavalla solmulla ei ole lapsia, me vain poistamme sen. Algoritmin ei tarvitse muuttaa puuta uudelleen.

  • Skenaario 2: Solmu, jossa on vain yksi lapsi (vasen tai oikea lapsi).

Tässä tapauksessa algoritmiamme täytyy saada solmun vanhempi osoittamaan lapsisolmuun. Jos solmu on vasen lapsi, saamme vasemman lapsen vanhemman osoittamaan lapselle. Jos solmu on vanhempansa oikea lapsi, saamme oikean lapsen vanhemman osoittamaan lapselle.

  • Skenaario # 3: Solmu, jossa on kaksi lasta.

Kun solmulla on 2 lasta, meidän on löydettävä solmu, jolla on pienin arvo, alkaen solmun oikeasta lapsesta. Laitamme tämän solmun minimiarvolla sen solmun paikkaan, jonka haluamme poistaa.

On aika koodata.

  1. Ensin: Huomaa parametrien arvo ja vanhempi. Haluamme löytää solmulla, jolla on tämä arvo, ja solmun vanhempi on tärkeä solmun poistamiselle.
  2. Toinen: Huomaa palautusarvo. Algoritmimme palauttaa boolean-arvon. Se palauttaa arvon True, jos se löytää solmun ja poistaa sen. Muuten se palauttaa väärin.
  3. Riviltä 2 riville 9: Alamme etsiä solmua, jolla on etsimämme arvo. Jos arvo on pienempi kuin nykyinen solmuarvo, siirrymme vasempaan alaosaan rekursiivisesti (jos ja vain jos nykyisellä solmulla on vasen lapsi). Jos arvo on suurempi, siirry rekursiivisesti oikeaan alaosaan.
  4. Rivi 10: Alamme pohtia poistoalgoritmia.
  5. Riviltä 11 riville 13: Peitämme solmun ilman lapsia, ja se on vanhempansa vasen lapsi. Poistamme solmun asettamalla vanhemman vasemman lapsen arvoon Ei mitään.
  6. Rivit 14 ja 15: Peitämme solmun ilman lapsia, ja se on vanhempansa oikea lapsi. Poistamme solmun asettamalla vanhemman oikean lapsen arvoon Ei mitään.
  7. Tyhjennä solmun menetelmä: Näytän alla olevan clear_node-koodin. Se asettaa solmut vasen lapsi, oikea lapsi ja sen arvoksi Ei mitään.
  8. Riviltä 16 riville 18: Peitämme solmun vain yhdellä lapsella (vasen lapsi), ja se on vanhemmansa vasen lapsi. Asetamme vanhemman vasemman lapsen solmun vasemmalle lapselle (ainoa lapsi, jolla se on).
  9. Riviltä 19 riville 21: Peitämme solmun vain yhdellä lapsella (vasen lapsi), ja se on vanhempansa oikea lapsi. Asetamme vanhemman oikean lapsen solmun vasemmalle lapselle (ainoa lapsi, jolla se on).
  10. Riviltä 22 riville 24: Peitämme solmun vain yhdellä lapsella (oikea lapsi), ja se on vanhempansa vasen lapsi. Asetamme vanhemman vasemman lapsen solmun oikealle lapselle (ainoa lapsi, jolla se on).
  11. Riviltä 25 riviin 27: Peitämme solmun vain yhdellä lapsella (oikea lapsi), ja se on vanhempansa oikea lapsi. Asetamme vanhemman oikean lapsen solmun oikealle lapselle (ainoa lapsi, jolla se on).
  12. Riviltä 28 riville 30: Peitämme solmun sekä vasemmalla että oikealla lapsella. Saadaan solmu, jolla on pienin arvo (koodi näkyy alla) ja asetamme sen nykyisen solmun arvoon. Viimeistele se poistamalla pienin solmu.
  13. Rivi 32: Jos löydämme etsimäsi solmun, sen on palautettava True. Riviltä 11 riville 31 käsittelemme tätä tapausta. Joten palauta vain totta ja siinä se on.
  • Clear_node-menetelmän käyttäminen: aseta arvoksi Ei mitään kaikille kolmelle määritteelle - (arvo, vasen_lapset ja oikea_lapset)
  • Find_minimum_value -menetelmän käyttäminen: mene alas vasemmalle. Jos emme enää löydä solmuja, löysimme pienimmän.

Testatkaamme nyt.

Käytämme tätä puuta testataamme elim_node-algoritmiamme.

Poistetaan solmu, jolla on arvo 8. Se on solmu, jolla ei ole lasta.

Poista nyt solmu, jolla on arvo 17. Se on solmu, jossa on vain yksi lapsi.

Lopuksi poistamme solmun, jossa on kaksi lasta. Tämä on meidän puumme juuri.

Testit on nyt tehty. :)

Tässä kaikki tältä erää!

Oppimme täällä paljon.

Onnittelut tämän tiheän sisällön viimeistelystä. On todella vaikeaa ymmärtää käsitettä, jota emme tunne. Mutta sinä teit sen. :)

Tämä on vielä yksi askel eteenpäin matkalla algoritmien ja tietorakenteiden oppimiseen ja hallitsemiseen. Voit nähdä koko matkani asiakirjat täältä Renaissance Developer -julkaisussa.

Pidä hauskaa, jatka oppimista ja koodausta.

Toivottavasti pidit tästä sisällöstä. Tue Ko-Fi-työni

Oma Twitter ja Github. ☺

Lisäresurssit

  • Mycodeschoolin esittely puiden tietorakenteeseen
  • Puu Wikipediasta
  • Lahjallisen Vaidehi Joshin puiden kompaste
  • Esittely puille, professori Jonathan Cohenin luento
  • Esittely puille, professori David Schmidtin luento
  • Esittely puille, professori Victor Adamchikin luento
  • Puut kanssa Gayle Laakmann McDowell
  • BK-puun toteutus ja testit TK: lla
  • Kurssikurssi: Kalifornian yliopiston San Diegon tietorakenteet
  • Kurssikurssi: Tietorakenteet ja suorituskyky Kalifornian yliopistossa, San Diegossa
  • Binaarisen hakupuun käsitteet ja toteutus Paul-ohjelmoinnilla
  • BK: n binaarinen hakupuun toteutus ja testit
  • Puun läpikulku Wikipediasta
  • Binaarinen hakupuu Poista solmun algoritmi kirjoittanut GeeksforGeeks
  • Binaarinen hakupuu Poista solmun algoritmi Algolistilta
  • Pythonin oppiminen nollasta sankarille