Kahendpuu, mille igas tipus on kirje. Puus on 9 tippu ning juurtippu kirjeks on 2. Juurtipu vasaku alluva kirje on 7 ja parema alluva kirje on 5

Kahendpuu ehk binaarpuu on arvutiteaduses kasutusel olev andmestruktuur, mis koosneb tippudest, kusjuures igal tipul on maksimaalselt kaks alluvat. Tipu ühte alluvat nimetatakse vasakuks alluvaks ja teist paremaks alluvaks. Hulgateoorias saab (mittetühja) kahendpuud defineerida rekursiivselt kui ennikut (L, S, R), kus L ja R on kahendpuud või tühjad hulgad ja S on üheelemendiline hulk.[1]

Graafiteoorias vaadeldakse kahendpuid (üldisemalt kõiki k-aarseid puid) kui suunatud graafe, kus üks tipp u on juurtipp ning igasse teise tippu v leidub temast täpselt üks suunatud lihtahel.[2] Kahendpuud võib vaadelda ka kui suunamata graafi. Täpsemalt on tegemist järjestatud juurega puuga[3]. Mõned autorid kasutavad terminit juurega kahendpuu, et rõhutada asjaolu, et tegemist on juurega puuga.[4] Samas on ülaltoodud definitsioonidest näha, et iga kahendpuu on juurega puu.

Matemaatikas ei ole kahendpuudel ühtset definitsiooni. Mõned matemaatikud kasutavad arvutiteaduses levinud definitsioone[5], kuid mõnedes definitsioonides peab igal tipul, mis pole leht, olema täpselt kaks alluvat ning tingimata ei nõuta alluvate (vasaku/parema) järjestamist.[6]

Kahendpuude kasutusviisid

Kahendpuudel on palju otstarbeid. Üldiselt võib need jagada kaheks.

Kahendpuude tüübid

Kompaktne kahendpuu
Täis-kahendpuu

Kahendpuude terminoloogia pole standardiseeritud, seega kirjeldatakse kahendpuid kirjanduses paljude mõistetega.

Kahendpuus nimetatakse tasemeks kõikide tippude hulka, mis asuvad samal kaugusel juurtipust.[9]

Kahendpuude omadused

Kahendpuude teoorias ei ole kokkulepet, mis on ühetipulise puu kõrgus. Mõnes allikas kirjutatakse, et see on 0[10] , aga teises, et see on 1.[9] Järgnevates näidetes eeldatakse, et ühetipulise puu kõrgus on 0.

Kahendpuude esitus arvutis

Kahendpuid saab arvutis programmeerimiskeelte abil esitada mitut moodi.

Haskell

Näiteks Haskellis saab kahendpuud esitada uue andmetüübina, millel on kaks konstruktorit:[12]

data Tree a = Leaf | Node a (Tree a) (Tree a)

Python

Pythonis (ja ka paljudes teiste keeltes) saab kahendpuud esitada tipuklassina, kus igal isendil on viide oma alluvatele, mis on samuti tipud.[13]

class Node: 
    def __init__(self,key): 
        self.left = None
        self.right = None
        self.val = key

Massiivina

Mõnel juhul soovitakse kahendpuid kujutada massiividena. Näiteks kahendkuhi, mis põhineb kompaktsel kahendpuul, esitatakse tihti lihtsalt massiivina, kus elemendid paiknevad järjestikuselt tasemete kaupa.[10] See tähendab, et massiivi alguses on juurtipp, siis tema alluvad, siis nende alluvate alluvad jne.

Viited

  1. Rowan Garnier; John Taylor (2009). Discrete Mathematics: Proofs, Structures and Applications, Third Edition. CRC Press. Lk 620. ISBN 978-1-4398-1280-8.
  2. Knuth (1997). The Art Of Computer Programming, Volume 1, 3/E. Pearson Education. Lk 363. ISBN 0-201-89683-4.
  3. Kenneth Rosen (2011). Discrete Mathematics and Its Applications, 7th edition. McGraw-Hill Science. Lk 749. ISBN 978-0-07-338309-5.
  4. David R. Mazur (2010). Combinatorics: A Guided Tour. Mathematical Association of America. Lk 246. ISBN 978-0-88385-762-5.
  5. Hazewinkel, Michiel (2001). Encyclopedia of Mathematics. Springer Science+Business Media B.V. / Kluwer Academic Publishers. ISBN 978-1-55608-010-4.
  6. L.R. Foulds (1992). Graph Theory Applications. Springer Science & Business Media. Lk 32. ISBN 978-0-387-97599-3.
  7. David Makinson (2009). Sets, Logic and Maths for Computing. Springer Science & Business Media. Lk 199. ISBN 978-1-84628-845-6.
  8. Jonathan L. Gross (2007). Combinatorial Methods with Computer Applications. CRC Press. Lk 248. ISBN 978-1-58488-743-0.
  9. 9,0 9,1 9,2 Ahti Peder, Jüri Kiho, Härmel Nestra (2017). Algoritmid ja andmestruktuurid, Ülesannete kogu. Tartu: Tartu Ülikooli Kirjastus.((raamatuviide)): CS1 hooldus: mitu nime: autorite loend (link)
  10. 10,0 10,1 10,2 10,3 Jüri Kiho (2003). Algoritmid ja andmestruktuurid. Tartu: Tartu Ülikooli Kirjastus.
  11. Aaron M. Tenenbaum, et al. Data Structures Using C, Prentice Hall, 1990
  12. "Hackage - Haskell package archive". Vaadatud 10.11.2018.
  13. "GeeksforGeeks - A computer science portal for geeks". Vaadatud 10.11.2018.