Sunteți pe pagina 1din 21

Arbori binari de cutare

Arbori binari de cutare


mbuntairea performanei operaiei de cutare inserare tergere analog al listei ordonate

Arbori binari de cutare definiii


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 cutare - definiii


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].

Arbori binari de cutare Proprietate important:


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 cutare -exemple


44
22 44

77

22

77

11

33 88

99

11

33

44

99

22

88

99

(a) Arbore binar de cutare strict. (b) Arbore binar de cutare nestrict la dreapta. Cheile 22, 44 i 99 sun t chei multiple. Exemple de arbori binari de cutare.

Cutarea n 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}

Cutarea n a.b.c. cu nod marcaj


Root

55

33

77

11

66

99

mEnd

Arbore binar de cutare completat cu nod marcaj la sfrit.

Cutare cu inserare n 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

Cutare cu inserare n a.b.c.


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 n 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 n a.b.c. - iterativ (continuare)


... 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

Cautare cu inserare n a.b.c. - iterativ (continuare)


{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}

tergere 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}

tergere nod din a.b.c. (continuare)


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

tergere nod din a.b.c. (continuare)

(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}

tergere nod din a.b.c. (continuare)


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.left; d: = 1 end

tergere nod din a.b.c. (continuare)


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).

Complexitatea operaiilor la arborele binar de cutare (continuare)


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