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 IspisiStablo(element^.levo); Write(element^.Vrednost, ' '); 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.
Kako funkcioniše
1. Definicija binarnog stabla
type cvor = ^slog;
slog = record
vrednost: Integer;
levo: cvor;
desno: cvor;
end;
cvor
je pokazivač na zapis (rekord) tipaslog
.slog
sadrži:vrednost
: broj koji se čuva u čvoru.levo
: pokazivač na levo dete čvora.desno
: pokazivač na desno dete čvora.
2. Funkcija KreirajCvor
function KreirajCvor(Vrednost: integer): cvor;
var NoviCvor: cvor;
begin
New(NoviCvor);
NoviCvor^.Vrednost := Vrednost;
NoviCvor^.Levo := nil;
NoviCvor^.Desno := nil;
KreirajCvor := NoviCvor;
end;
- Kreira novi čvor u stablu sa zadatom vrednošću.
- Inicijalizuje pokazivače
levo
idesno
nanil
, jer novokreirani čvor nema decu.
3. Procedura DodajUCvor
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;
- Dodaje novu vrednost u stablo:
- Ako je trenutni čvor
nil
, kreira se novi čvor pomoćuKreirajCvor
. - Ako je vrednost manja od vrednosti u trenutnom čvoru, dodaje se u levo podstablo (
levo
). - Ako je vrednost veća ili jednaka, dodaje se u desno podstablo (
desno
).
- Ako je trenutni čvor
- Rekurzivno se poziva dok ne pronađe mesto za novu vrednost.
4. Procedura IspisiStablo
procedure IspisiStablo(element: cvor);
begin
if element <> nil then
begin
IspisiStablo(element^.levo);
Write(element^.Vrednost, ' ');
IspisiStablo(element^.desno);
end;
end;
- Ispisuje stablo koristeći in-order redosled:
- Prvo obilazi levo podstablo.
- Ispisuje trenutnu vrednost.
- Na kraju obilazi desno podstablo.
- Ovaj redosled rezultira ispisom elemenata u rastućem poretku.
5. Glavni program
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.
Koren
je početni čvor stabla, inicijalizovan nanil
.n
: broj elemenata koji će biti uneti u stablo.- Petlja za unos elemenata:
- Korisnik unosi
n
brojeva. - Svaki broj se dodaje u stablo pomoću
DodajUCvor
.
- Korisnik unosi
- Nakon unosa svih brojeva, ispisuje se sadržaj stabla korišćenjem
IspisiStablo
.