Sunteți pe pagina 1din 15

Arbori binari de cautare

Arbori binari de cautare


Imbunatatirea performantei operatiei de cautare inserare stergere analog al listei ordonate

Arbori binari de cautare - definitii


Definiie. Un arbore binar ale crui chei iau valori de un tip total ordonat se numete arbore binar de cutare (strict) dac cheia fiecrui nod este mai mare dect orice cheie din fiul su stng i mai mic dect orice cheie din fiul su drept. Formal, ntr-un arbore binar de cutare, pentru orice nod u al su avem relaiile: (1) info[u] > info[v], pentru orice v in left[u] (2) info[u] < info[w], pentru orice w in right[u]. S observm c ar fi suficient s impunem existena acestor relaii de ordine ntre un nod i descendenii si direci. Cu alte cuvinte, T este un arbore binar, cu chei de un tip total ordonat, i cu proprietatea c pentru orice nod u al su avem relaiile : (1) info[u] > info[root(left[u])] (2) info[u] < info[root(right[u])]

Arbori binari de cautare - definitii


Problema cheilor multiple: Numim arbore binar de cutare nestrict la stnga un arbore binar T cu proprietatea c n fiecare nod u al su avem relaiile: (3) info[u] >= info[v], pentru orice v in left[u] (4) info[u] < info[w], pentru orice w in right[u]. Analog, se definete noiunea de arbore binar de cutare nestrict la dreapta, cu relaiile: (5) info[u] > info[v], pentru orice v in left[u] (6) info[u] <= info[w], pentru orice w in right[u]. Proprietate importanta: parcurgerea n inordine (SRD) a unui asemenea arbore produce o list ordonat cresctor a cheilor. De aceea structura de arbore binar de cutare este potrivit pentru seturi de date pe care, pe lng inserri i tergeri, se cere destul de frecvent ordonarea total a cheilor.

Arbori binari de cautare -exemple


44
44

22

77

22

77

11

33

99

11

33

44

99

88

22

88

99

(a) Arbore binar de cutare strict. (b) Arbore binar de cutare nestrict la dreapta. Cheile 22, 44 i 99 sunt chei multiple.

Cautarea in a.b.c.
function Loc (Val: integer; Root: pnod): pnod; var found: boolean; begin Loc :=Root; found:= false; while (Loc <> nil) and not found do begin if Loc.info = Val then found = true; else if Loc.info > Val then Loc:= Loc.left else Loc:= Loc.right end; end; {function Loc}

Cautarea in a.b.c. cu nod marcaj


Root

55

33

77

11

66

99

mEnd

Fig.4.1.2. Arbore binar de cutare completat cu nod marcaj la sfrit.

Cautare cu inserare in a.b.c.


procedure SearchIns (x: integer; var Root: pnod); {pt. cheile multiple se incrementeaza un camp contor} begin if Root= nil then {x nu a fost gsit i va fi inserat} begin new (Root); with Root do begin {completarea cmpurilor noului nod} info:= x ; contor:= 1; left:= nil; right:= nil; end end else {Root<>nil} if x<Root.info then SearchIns (x, Root.left) else if x>Root.info then SearchIns (x, Root.right) else {x a fost gsit i se incrementeaz contorul} Root.contor:= Root.contor + 1 end; {SearchIns}

Creare a.b.c. prin inserari repetate

begin {program construcie arbore binar de cutare prin inserri repetate} Root:= nil; {iniializarea arborelui cu arborele vid} while not eof do {dac fiierul este consola} begin read (x); SearchIns (x, Root) end end.

Cautare cu inserare in a.b.c. - iterativ


procedure SearchInsIterativ (x: integer; var root: pnod; var p:pnod); var p1: pnod; d: integer; begin {iniializarea pointerilor pentru parcurgere} p1:= nil; p:= root; d:=1; while (p<>nil) and (d<>0) do if x<p.info then begin p1:= p; p:= p.left ; d:= -1 end else if x>p.info then begin p1:= p; p:= p.right; d:= 1; end else {x= p.info} d:= 0; ...

Cautare cu inserare in a.b.c. - iterativ (cont.)


... if p<>nil then {d=0 i am gsit x n arborele root,deci trebuie incrementat contorul} p.contor:= p.contor+1; else {p=nil i facem inserarea} begin new(p); with p do begin info:= x; contor:= 1; left:= nil; right:= nil end {legarea noului nod la tata} if p1=nil then root:=p {cazul inserrii ntr-un arbore vid} else if d<0 then p1.left:= p; else p1.right:= p end end; {procedura SearchInsIterativ}

Stergere nod din a.b.c.


procedure Search Del (x: integer; root: pnod ); var p1, p2, falseroot: pnod; {p1, p2 pointeri cureni, falseroot pentru nod fals nainte de rdcin } {Delete1 sterge nod cu cel mult un fiu nevid, Delete2 sterge nod cu doi fii nevizi} procedure Delete1(var p: pnod);{terge nodul p cu cel mult un succesor} begin if p.left = nil then p: = p.right else p: =p.left end; {Delete 1} ...

procedure Delete 2 (var p: pnod ); {terge nodul p cu doi succesori } {caut predecesorul n inordine al lui p.info mergnd un pas la stnga, apoi la dreaptact se poate . Parcurgerea se face cu r i q = tat r } var q, r: pnod; { d1 = -1 <=> r = q.left } d1: integer; { d1 = 1 <=> r = q.right } begin (a) q: = p r: = p.left d1: = -1 while r.right <> nil do begin q: = r r: = r.right; d1: = 1 end (b) p.info: = r.info; {Se copiaz n p valorile din r} p.contor = r.contor; (c) {Se leag de tat, q, subarborele stng al lui r } if d1< 0 then q.left: = r.left else q.right: = r.left end; {Delete 2}

begin {Search Del} new( falseroot ); falseroot.right: = root ; {adugm nod marcaj} p1: = root; p2: = falseroot; d: = 1; found: = false while (p1<> nil ) and not found do begin p2: = p1 if x < p1 .info then begin p2: = p1; p1: = p1.left; d: = -1 end else if x > p1.info then begin p2: = p1; p1: = p1.right; d: = 1 end else found: = true end; if not found then "Nu am gsit " else {found = true i trebuie s terg nodul p1} begin if (p1.left=nil ) or (p1.right = nil ) then Delete1 (p1) {tergere caz 1} else Delete 2 (p1); {tergere caz 2} {legarea noului nod p1 de tatl su p2} if d > 0 then p2.right: = p1 else p2.left: = p1 end end; {procedure SearchDel}

Complexitatea operaiilor la arborele binar de cutare.


Operaiile de inserare i tergere de noduri ntr-un arbore binar de cutare depind n mod esenial de operaia de cutare. Cutarea revine la parcurgerea, eventual incomplet, a unei ramuri, de la rdcin pn la un nod interior n cazul cutrii cu succes, sau pn la primul fiu vid ntlnit n cazul cutrii fr succes (i al inserrii). Performana cutrii depinde de lungimea ramurilor pe care se caut; media ei va fi dat de lungimea medie a ramurilor, iar dimensiunea maxim de lungimea celor mai lungi ramuri, adic de adncimea arborelui. Forma arborelui, deci i adncimea depind, cu algoritmii dai, de ordinea introducerii cheilor i putem avea cazul cel mai nefavorabil, n care adncimea arborelui este n, numrul nodurilor din arbore, adic performana cutrii rezult O(n). n viitor vom face operaia de completare canonic a unui arbore binar la unul strict, n care fiecare fiu vid se nlocuiete cu un nod special, frunz. Tot acolo se estimeaz lungimea medie a drumului de la rdcin pn la o frunz i adncimea unui asemenea arbore. Anticipnd puin, avem o limit inferioar pentru adncime de ordinul lui log2n, ceea ce nsemn c performana operaiei de cutare nu poate cobor sub ea. Ne punem problema dac putem atinge aceast valoare optim.

S-ar putea să vă placă și