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]
Kahendpuudel on palju otstarbeid. Üldiselt võib need jagada kaheks.
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 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.
Kahendpuid saab arvutis programmeerimiskeelte abil esitada mitut moodi.
Näiteks Haskellis saab kahendpuud esitada uue andmetüübina, millel on kaks konstruktorit:[12]
data Tree a = Leaf | Node a (Tree a) (Tree a)
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
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.
((raamatuviide))
: CS1 hooldus: mitu nime: autorite loend (link)