You are on page 1of 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


Defini ie. Un arbore binar ale c rui chei iau valori de un tip total ordonat se nume te arbore binar de c utare (strict) dac cheia fiec rui nod este mai mare dect orice cheie din fiul s u stng i mai mic dect orice cheie din fiul s u drept. Formal, ntr-un arbore binar de c utare, pentru orice nod u al s u avem rela iile: (1) info[u] > info[v], pentru orice v in left[u] (2) info[u] < info[w], pentru orice w in right[u]. S observ m c ar fi suficient s impunem existen a acestor rela ii de ordine ntre un nod i descenden ii s i direc i. Cu alte cuvinte, T este un arbore binar, cu chei de un tip total ordonat, i cu proprietatea c pentru orice nod u al s u avem rela iile : (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 c utare nestrict la stnga un arbore binar T cu proprietatea c n fiecare nod u al s u avem rela iile: (3) info[u] >= info[v], pentru orice v in left[u] (4) info[u] < info[w], pentru orice w in right[u]. Analog, se define te no iunea de arbore binar de c utare nestrict la dreapta, cu rela iile: (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 cresc tor a cheilor. De aceea structura de arbore binar de c utare este potrivit pentru seturi de date pe care, pe lng inser ri 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 c utare strict. (b) Arbore binar de c utare 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 Loco.info = Val then found = true; else if Loco.info > Val then Loc:= Loco.left else Loc:= Loco.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 c utare completat cu nod marcaj la sf r it.

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 g sit i va fi inserat} begin new (Root); with Rooto do begin {completarea cmpurilor noului nod} info:= x ; contor:= 1; left:= nil; right:= nil; end end else {Root<>nil} if x<Rooto.info then SearchIns (x, Rooto.left) else if x>Rooto.info then SearchIns (x, Rooto.right) else {x a fost g sit i se incrementeaz contorul} Rooto.contor:= Rooto.contor + 1 end; {SearchIns}

Creare a.b.c. prin inserari repetate

begin {program construc ie arbore binar de c utare prin inser ri repetate} Root:= nil; {ini ializarea arborelui cu arborele vid} while not eof do {dac fi ierul 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 {ini ializarea pointerilor pentru parcurgere} p1:= nil; p:= root; d:=1; while (p<>nil) and (d<>0) do if x<po.info then begin p1:= p; p:= po.left ; d:= -1 end else if x>po.info then begin p1:= p; p:= po.right; d:= 1; end else {x= po.info} d:= 0; ...

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


... if p<>nil then {d=0 i am g sit x n arborele root,deci trebuie incrementat contorul} po.contor:= po.contor+1; else {p=nil i facem inserarea} begin new(p); with po do begin info:= x; contor:= 1; left:= nil; right:= nil end {legarea noului nod la tata} if p1=nil then root:=p1 {cazul inser rii ntr-un arbore vid} else if d<0 then p1o.left:= p; else p1o.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 curen i, falseroot pentru nod fals nainte de r d cin } {Delete1 sterge nod cu cel mult un fiu nevid, Delete2 sterge nod cu doi fii nevizi} procedure Delete1(var p: pnod);{ terge nodul po cu cel mult un succesor} begin if po.left = nil then p: = po.right else p: =po.left end; {Delete 1} ...

procedure Delete 2 (var p: pnod ); { terge nodul po cu doi succesori } {caut predecesorul n inordine al lui po.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 = qo.left } d1: integer; { d1 = 1 <=> r = qo.right } begin (a) q: = p r: = po.left d1: = -1 while ro.right <> nil do begin q: = r r: = ro.right; d1: = 1 end (b) po.info: = ro.info; {Se copiaz n po valorile din ro} po.contor = ro.contor; (c) {Se leag de tat , q, subarborele stng al lui r } if d1< 0 then qo.left: = ro.left else qo.right: = ro.left end; {Delete 2}

begin {Search Del} new( falseroot ); falserooto.right: = root ; {ad ug m nod marcaj} p1: = root; p2: = falseroot; d: = 1; found: = false while (p1<> nil ) and not found do begin p2: = p1 if x < p1o.info then begin p2: = p1; p1: = p1o.left; d: = -1 end else if x > p1o.info then begin p2: = p1; p1: = p1o.right; d: = 1 end else found: = true end; if not found then "Nu am g sit " else {found = true i trebuie s terg nodul p1o} begin if (p1o.left=nil ) or (p1o.right = nil ) then Delete1 (p1) { tergere caz 1} else Delete 2 (p1); { tergere caz 2} {legarea noului nod p1o de tat l s u p2o} if d > 0 then p2o.right: = p1 else p2o.left: = p1 end end; {procedure SearchDel}

Complexitatea opera iilor la arborele binar de c utare.


Opera iile de inserare i tergere de noduri ntr-un arbore binar de c utare depind n mod esen ial de opera ia de c utare. C utarea revine la parcurgerea, eventual incomplet , a unei ramuri, de la r d cin pn la un nod interior n cazul c ut rii cu succes, sau pn la primul fiu vid ntlnit n cazul c ut rii f r succes ( i al inser rii). Performan a c ut rii 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 da i, de ordinea introducerii cheilor i putem avea cazul cel mai nefavorabil, n care adncimea arborelui este n, num rul nodurilor din arbore, adic performan a c ut rii rezult O(n). n viitor vom face opera ia de completare canonic a unui arbore binar la unul strict, n care fiecare fiu vid se nlocuie te cu un nod special, frunz . Tot acolo se estimeaz lungimea medie a drumului de la r d cin pn la o frunz i adncimea unui asemenea arbore. Anticipnd pu in, avem o limit inferioar pentru adncime de ordinul lui log2n, ceea ce nsemn c performan a opera iei de c utare nu poate cobor sub ea. Ne punem problema dac putem atinge aceast valoare optim .

You might also like