program BinarnoStablo; type cvor = ^slog; slog = record vrednost: Integer; levo: cvor; desno: cvor; end; function KreirajCvor(Vrednost: integer): cvor; var NoviCvor: cvor; begin New(NoviCvor); NoviCvor^.Vrednost := Vrednost; NoviCvor^.Levo := nil; NoviCvor^.Desno := nil; KreirajCvor := NoviCvor; end; procedure DodajUCvor(var Trenutni: cvor; Vrednost: integer); begin if Trenutni = nil then Trenutni := KreirajCvor(Vrednost) else if Vrednost < Trenutni^.Vrednost then DodajUCvor(Trenutni^.levo, Vrednost) else DodajUCvor(Trenutni^.desno, Vrednost); end; procedure IspisiStablo(element: cvor); begin if element <> nil then begin write(element^.vrednost, ' '); IspisiStablo(element^.levo); IspisiStablo(element^.desno); end; end; var Koren: cvor; n, i, x :integer; begin Koren := nil; readln(n); for i := 1 to n do begin readln(x); DodajUCvor(Koren, x); end; write('Ispis stabla: '); writeln; IspisiStablo(Koren); end.
1. Početak funkcije
if element <> nil then
Ova linija proverava da li je trenutni čvor nil
(prazan). Ako je nil
, znači da smo stigli do kraja grane stabla i funkcija se neće dalje pozivati za taj čvor. Ako nije nil
, nastavljamo sa obradom čvora.
2. Ispis trenutnog čvora
write(element^.Vrednost, ' ')
Ovaj deo koda ispisuje vrednost trenutnog čvora na ekranu. Ovo se dešava pre nego što pozovemo rekurzivnu funkciju za levo i desno podstablo, što je karakteristično za pre-order obilazak.
3. Rekurzivni poziv za levo stablo
IspisiStablo(element^.levo);
Ovaj poziv znači da se funkcija IspisiStablo
ponovo poziva, ali sada za levo podstablo trenutnog čvora. Ovdje je ključna rekurzija: svaki put kada se funkcija pozove za element^.levo
, ona ponovo proverava da li je čvor nil
i, ako nije, nastavlja dalje.
4. Rekurzivni poziv za desno stablo
IspisiStablo(element^.desno);
Ovaj deo poziva funkciju IspisiStablo
za desno podstablo trenutnog čvora. Slično kao za levo podstablo, funkcija se ponovo poziva za desni podstablo dok ne dođe do nil
(kada stigne do kraja stabla).