A i r b o r
Arbori Arbori?!?!?! Prin nod se înţelege o variabilă dinamică de tipul record care conţine un cîmp destinat memorării informaţiilor utile şi doi indicatori de adresă. Arborele binar se defineşte recursiv astfel: 1. Un nod este un arbore binar 2. Un nod ce conţine legături către alţi doi arbori binari este un arbore binar Prin convenţie, arborele vid nu conţine nici un nod. Nodul spre care nu este îndreptată nici o legătură se numeşte rădăcină
Arbori Structura arborelui Cei doi arbori conectaţi la rădăcină se numesc subarborele stîng şi subarborele drept. Un nod la care nu este conectat nici un subarbore este un nod terminal, în caz contrar este neterminal. În programele de mai jos se vor utiliza următoarele notaţii: x^.st - subarborele stîng x^.dr - subarborele drept x^.par - părintele nodului
Arbori Inserarea unui nod k= x= rad 6 Var rad:Nod; procedure intr(var x:Nod;k:integer); begin if x=nil then new(x); x^.inf:=k; x^.st:=nil; x^.dr:=nil; end else if k>x^.inf then intr(x^.dr,k) else intr(x^.st,k); end; intr(rad,6); end. x= rad if x=nil then if x=nil then if x=nil then if x=nil then 9 new(x); st dr x^.inf:=k; 5 14 x^.st:=nil; x^.dr:=nil; st dr st dr 3 nil 7 10 nil 16 nil else if k>x^.inf then intr(x^.dr,k) else if k>x^.inf then intr(x^.dr,k) else if k>x^.inf then intr(x^.dr,k) nil else intr(x^.st,k); else intr(x^.st,k); st dr end; 6 nil 6 8 nil intr(rad,6); nil nil end.
3 5 6 7 8 9 10 14 16 Arbori Parcurge inordine x= rad 9 st dr 5 14 st Var rad:Nod; procedure parcurge(x:Nod); begin if x^.st<>nil then parcurge(x^.st); Write(x^.info,’ ‘); if x^.dr<>nil then parcurge(x^.dr); end; parcurge(rad); end. x= rad if x^.st<>nil then parcurge(x^.st); if x^.st<>nil then parcurge(x^.st); if x^.st<>nil then parcurge(x^.st); if x^.st<>nil then parcurge(x^.st); if x^.st<>nil then parcurge(x^.st); if x^.st<>nil then parcurge(x^.st); if x^.st<>nil then parcurge(x^.st); if x^.st<>nil then parcurge(x^.st); if x^.st<>nil then parcurge(x^.st); 9 Write(x^.info,’ ’); Write(x^.info,’ ’); Write(x^.info,’ ’); Write(x^.info,’ ’); Write(x^.info,’ ’); Write(x^.info,’ ’); Write(x^.info,’ ’); Write(x^.info,’ ’); Write(x^.info,’ ’); if x^.dr<>nil then parcurge(x^.dr); if x^.dr<>nil then parcurge(x^.dr); if x^.dr<>nil then parcurge(x^.dr); if x^.dr<>nil then parcurge(x^.dr); if x^.dr<>nil then parcurge(x^.dr); if x^.dr<>nil then parcurge(x^.dr); if x^.dr<>nil then parcurge(x^.dr); if x^.dr<>nil then parcurge(x^.dr); if x^.dr<>nil then parcurge(x^.dr); st dr 5 14 parcurge(rad); st dr st dr end. 3 nil 7 10 nil 16 nil st dr 6 nil 8 nil 3 5 6 7 8 9 10 14 16
Arbori Parcurgeri in arbori Parcurgerea în preordine sau traversarea RSD: 1) se vizitează rădăcina 2) se vizitează subarborele stîng 3) se vizitează subarborele drept Parcurgerea în inordine sau traversarea SRD: 1) se vizitează subarborele stîng 2) se vizitează rădăcina 3) se vizitează subarborele drept Parcurgerea în postordine sau traversarea SDR: 1) se vizitează subarborele stîng 2) se vizitează subarborele drept 3) se vizitează rădăcina
6 5 6 7 9 Arbori Cautare iterativa x^.info= k= x= res= rad gaseste= Var rad,res:Nod; function gaseste(k:Integer):Nod; var x:Nod; begin x:=rad; while (x<>nil) and (k<>x^.info) do if (k<x^.info) then x:=x^.st else x:=x^.dr; end; gaseste:=x; res:=gaseste(6); end. x^.info= 6 5 6 7 9 k= x:=rad; x= NIL res= while (x<>nil) and (k<>x^.info) do while (x<>nil) and (k<>x^.info) do while (x<>nil) and (k<>x^.info) do while (x<>nil) and (k<>x^.info) do if (k<x^.info) then x:=x^.st if (k<x^.info) then x:=x^.st if (k<x^.info) then x:=x^.st rad else x:=x^.dr; 9 gaseste:=x; st dr end; 5 14 res:=gaseste(6); end. st dr st dr . 3 nil 7 10 nil 16 nil st dr 6 nil 8 nil gaseste= NIL
Arbori Element minim res= x= rad Var rad,res:Nod; function minim:Nod; var x:Nod; begin x:=rad; while (x^.st<>nil) do x:=x^.st; minim:=x; end; res:=minim; end. res= x:=rad; while (x^.st<>nil) do while (x^.st<>nil) do while (x^.st<>nil) do x:=x^.st; x:=x^.st; x= rad minim:=x; 9 res:=minim; st dr end. 5 14 st dr st dr 3 nil 7 10 nil 16 nil st dr 6 nil 8 nil
The End