Documente Academic
Documente Profesional
Documente Cultură
ALGORITMI DE CĂUTARE A
INFORMAŢIILOR BAZAȚI PE
ARBORI BINARI
ARGUMENT ....................................................................................... 3
BIBLIOGRAFIE ............................................................................... 32
2
ARGUMENT
3
Al doilea capitol este dedicat arborilor binari de căutare. Aici am
descris structura, modul de implementare și operațiile care se pot
efectua asupra nodurilor arborelui.
Ultimul capitol este unul aplicativ, un studiu de caz în care am
realizat un program pentru rezolvarea unei probleme, ce implementează,
prin funcții și proceduri, toate operațiile dintr-un arbore binar de căutare.
4
1. STRUCTURI DINAMICE DE DATE - ARBORI
Definiție
Definiție
5
În structura ierarhica a arborelui, fiecare nod (mai puțin rădăcina) este
subordonat unui alt nod (relație fiu-părinte). Daca un nod nu are fi, el se
numește terminal (sau frunza)
1. G este arbore.
2. G este un graf conex, minimal cu această proprietate (dacă
se elimină o muchie oarecare, se obține un graf neconex).
3. G este un graf fără cicluri, maximal cu această proprietate
(dacă se adaugă o muchie, se obține un graf care are măcar
un ciclu).
Definiție
6
Corolar: Un arbore cu n varfuri are n - 1 muchii.
De exemplu :
iar nodul 2 este tatal nodurilor 6, 1, 3, și 7; 5 este fiul lui 6; 4 este fiul lui
3; iar 8 este fiul lui 7. Nodurile 5, 4, 8, și 1 nu au nici un fiu. Nodurile care
nu au fii se mai numesc frunze sau noduri terminale, iar muchiile dintre
noduri, ramuri. Nodurile 6, 1 , 3 și 7 sunt frați. Nodurile 6, 1 , 3 și 7 sunt
urmașii lui 2. De asemenea, nodurile 5, 4 și 8 sunt urmașii lui 2, iar nodul
7
2 este strămoșul tuturor nodurilor (mai puțin el însuși), 2 fiind rădăcina
arborelui. 2 adică rădăcina este singurul nod care nu are tata.
în general, un nod al unui arbore poate avea un număr arbitrar
de fii. Daca orice nod al unui arbore nu are mai mult de n fii atunci
arborele se numește arbore n-ar.
Definiție
Definiție
Definiție
Un arbore binar este un arbore în care orice nod are cel mult doi
descendenți făcând-se distincție clara intre descendentul drept și
descendentul stâng. Rădăcina unui arbore binar are doi subarbori,
subarborele stâng, cel care are drept rădăcina fiul stâng și subarborele
drept, cel care are ca rădăcina fiul drept. Orice subarbore al unui arbore
binar este el însuși arbore binar. De exemplu, arborele de mai jos este
un arbore binar; rădăcina 10, are drept fiu stâng nodul 4, iar fiu drept
nodul 21, nodul 21 are subarborele stâng format din nodul 15 și
subarborele drept format din nodurile 23 și 28.
8
Nota: Un arbore binar poate fi și vid (adică fără nici un nod).
Un arbore binar pentru care orice nod neterminal are exact doi fii
se numește arbore plin ("full").
Arborele binar este arborele în care un nod are cel mult doi fii. În
aceasta situație se poate vorbi (pentru un arbore nevid) de cei doi
subarbori (stâng și drept) ai unui arbore.
Reprezentare
9
Pentru fiecare nod al arborelui se precizează informația și
descendenții direcți ca elemente a trei vector diferiți, INFO[i], ST[i] și
DR[i], unde i este indicele asociat unui nod. Cei trei vectori au
dimensiunea egala cu numarul de noduri din arbore. De exemplu, pentru
arborele de mai sus, daca numerotam nodurile începând cu nivelul 0, de
la stânga la dreapta, obținem următorii vectori, cu convenția ca rădăcina
este nodul 1: INFO= (10, 4, 21, 1, 9, 15, 23, 28), ST=(1, 4, 6, 0,0, 0, 0,
0), DR = (3, 5, 7, 0, 0, 0, 8, 0).
Reprezentarea înlănțuita
10
Traversare
11
1.2 Arbori parțiali de cost minim
Definiție
Observații:
12
Înălțimea unui arbore este maximum dintre nivelele nodurilor
terminale sau echivalent 1+maximul dintre înălțimile subarborilor săi.
13
doua câmpuri care conțin adresa rădăcinii subarborelui stâng, respectiv
drept.
14
Operații cu elemente (noduri), categorie din care cele mai
importante sunt operațiile de inserare și ștergere de noduri în și
din arbore.
15
Dacă nu există subarbore stâng, înseamnă că informația
căutată nu se găsește în arbore;
4. Altfel, dacă valoarea cheii căutate este mai mare decât valoarea
cheii din rădăcină, se va relua algoritmul pentru subarborele
drept. Dacă nu există subarbore drept, înseamnă că informația
căutată nu se găsește în arbore;
16
2. ARBORE BINAR DE CĂUTARE
Definiție
OBSERVAŢII!
1. Dacă o arborescență este formată dintr-un singur nod
spunem că este formată doar din nodul rădăcină.
2. Dacă ordinea relativă a arborescențelor, are importantă,
arborescența se numește se numește arbore ordonat.
Informația din fiecare nod este mai mare decât informația din nodul
fiului stâng și mai mică sau egală cu cea din nodul fiului drept. Un astfel
de arbore se poate reprezenta printr-o structură de date înlănțuită, în
care fiecare nod este un obiect. Pe lângă un câmp cheie și date
adiționale, fiecare obiect nod conține câmpurile stânga, dreapta și p care
punctează spre nodurile corespunzătoare fiului stâng, fiului drept și
respectiv părintelui nodului.
17
Într-un arbore binar de căutare, cheile sunt întotdeauna astfel
memorate încât ele satisfac proprietatea arborelui binar de căutare:
Exemple:
(a) (b)
18
Un arbore este compus din elementele numite noduri sau vârfuri
și legăturile dintre acestea. După cum am văzut, cea mai des utilizată
formă de organizare a unui arbore binar este următoarea:
Cheia nodului fiu stânga < Cheia nodului fiu stânga < Cheia
nodului fiu stânga
19
Căutarea unei informații identificate printr-o valoare X a cheii
începe de la rădăcină și se termină în cel mai rău caz la unul din nodurile
terminale, căutarea presupunând testarea a cel mult atâtea noduri câte
nivele are arborele binar de căutare. Dispunerea nodurilor arborelui pe
nivele face ca numărul operațiilor de testare la căutare să fie mult mai
mic decât în cazul listelor ordonate.
Metoda căutării binare prezentate în capitolul anterior poate fi
explicată cu ușurință cu ajutorul arborilor de căutare. Figura următoare
arată o reprezentare cu ajutorul arborilor binari al algoritmului care
corespunde cu algoritmul de căutare binară prezentat în capitolul
anterior, pentru N=10.
20
Fiu_st Cheia Alte_info Fiu_dr
Structura nodului ABC.
unde:
Fiu_st : reprezintă adresa fiului stânga;
Cheia: reprezintă câmpul ales după care este ordonat ABC și care
verifică relația ;
Alte_info : alte informații adiacente;
Fiu_dr : reprezintă adresa fiului dreapta;
a. creare-inițializare;
b. inserare;
c. căutare;
d. ștergere;
e. traversare:
21
Deoarece operația de traversare a fost analizată și descrisă în
capitolul anterior la arbori binari, ne vom ocupa de celelalte operații
specifice arborilor binari de căutare.
a. Operația de creare-inițializare. Specificarea problemei de creare-
inițializare, având ca date de intrare ABC specificat prin adresa ROOT
a nodului rădăcină, este următoarea:
DATE root;
REZULTATE root;
22
unde adresa reprezintă variabila de tip adresă a nodului, iar câmp
reprezintă numele câmpului nodului. Descrierea algoritmului în
Pseudocod este:
SUBALGORITMUL Creare_nod (ch, inf) ESTE:
@Alocare_spaţiu (NOU); { cererea de alocare spaţiu pentru un nod }
NOU^.fiu_st := NIL; { sistemul returnează adresa noului nod în variabila
adresă NOU }
NOU^.fiu_dr := NIL;
NOU^.cheia := ch;
NOU^.info := inf;
SF-Creare_nod
23
SFDACĂ
SFALGORITM
24
REZULTATE root;
Cazul 1: nodul de șters este un nod terminal, deci fără fii. Operația de
ștergere necesită eliminarea legăturii nod_tată și nod_de_şters și
eliberarea spațiului ocupat de nodul de șters.
Exemplu: nodurile cu cheia 1, 4, 7, 10 din ABC figura 2.1.
Cazul 3: nodul de șters este doi fii. În această situație nodul de șters
trebuie înlocuit și abia după aceea poate fi eliminat. Nodul înlocuitor
poate fi nodul cu cheia cea mai mare din punct de vedere lexicografic din
subarborele stâng al nodului de șters sau nodul cu cheia cea mai mică
din subarborele drept al nodului de șters.
Exemplu: nodurile cu cheia 2, 5, 8 din ABC figura 2.1. Nodul înlocuitor
al nodului cu cheia 2 este nodul cu cheia 1 din subarborele stâng sau
nodul cu cheia 3 din subarborele său drept. Nodul înlocuitor al nodului cu
cheia 5 este nodul cu cheia 4 din subarborele stâng sau nodul cu cheia 6
din subarborele său drept. Nodul înlocuitor al nodului cu cheia 8 este
nodul cu cheia 7 din subarborele stâng sau nodul cu cheia 9 din
subarborele său drept.
25
nodului de șters atunci se navighează de la nodul de șters un pas la
stânga și oricâți pași la dreapta, până ajungem la o legătură nulă.
26
SF-Cazul_1
tata := tmp;
tmp := tmp^.fiu_dr; { Adresa tatălui nodului înlocuitor este în variabila
tata}
SFCÂT { Adresa nodului înlocuitor este în variabila tmp}
adr^.cheia := tmp^.cheia; { Înlocuim nodul de șters cu nodul înlocuitor}
adr^.info := tmp^.info; { Înlocuim nodul de șters cu nodul înlocuitor}
tata^.fiu_dr := tmp^.fiu_st; { Eliminăm legătura tata - nodul înlocuitor}
@Eliberare spaţiu (tmp); { Eliberarea spațiului nod înlocuitor de la adresa
tmp }
SF-Cazul_3
27
3. STUDIU DE CAZ-APLICAȚII
28
Existenta operatorilor "+" sau "-" unari modifică numai diagrama de
sintaxă a expresiei aritmetice ( vezi figura ), celelalte rămânând
neschimbate.
Program arbori_asociati_expresiilor_aritmetice ;
type
reper =^nod ;
nod = record
v : char ;
stg, dr : reper ;
end ;
var
rad : reper ;
x : pointer ;
i, n : byte ;
car : char ;
procedure citire ;
begin
if not eoln then read(car)
end ;
29
procedure expresie (var p : reper ) ; forward ;
procedure termen (var p : reper ) ; forward ;
procedure factor (var p : reper ) ;
{ creeaza nodul terminal p^ sau subarborele de rădăcina p^ }
{ asociat unei expresii aritmetice cuprinsa între () }
begin
if car = '(' then
begin
citire ;
expresie (p) ; { aici car =) }
end ;
else
begin
new(p) ;
p ^.v := car ;
p ^.stg := NIL ;
p ^.dr := NIL ;
end ;
citire ;
end ;
procedure termen ;
var q : reper ;
begin
factor ( p ) ;
while car în [ '*', '/' ] do
begin
new ( q ) ;
q ^.v := car ;
q ^.stg := p ;
citire ; { operandul 2 începe după car }
factor (q ^. dr) ; { creează și leagă în dr. nodului q ^ }
p := q ; { subarb. asociat operandului 2 al lui car }
end ;
end ;
procedure expresie ;
var q : reper ;
begin
if car în [ '+', '-' ] then { expresia începe cu + sau - }
if car = '-' then
begin { car = - unar }
new ( p ) ;
30
p ^.v := '$' ; { $= - unar }
p ^.stg := NIL ;
citire ;
termen(p ^.dr) ;
end
else
begin { car =+ unar }
citire ;
termen ( p );
end
else termen ( p ) ;
while car în [ '+', '-' ] do
begin
new ( q ) ;
q ^.v := car ;
q ^.stg := p ;
citire ;
termen ( q ^.dr) ;
p := q;
end
;
BEGIN { programul principal }
mark (x) ; {retine vârful zonei HEAP }
write (' n=') ; readln (n);
for i:= 1 to n do
begin
read ( car ) ;
expresie ( rad ) ;
postordine (rad );
writeln ;
readln ;
release (x) ; { eliberează memoria ocupata dinamic }
end ;
END.
Pentru n=2 vom obține rezultatul :
(a+b)*(c-d)
abc+cd-*
-a+b
a$b+
31
BIBLIOGRAFIE
32