210 likes | 495 Views
Pemet e Kerkimit Binar (vazhdim). Leksion 9. Ne kete leksion do te shohim disa veprime te tjera mbi pemet e kerkimit binar. Rikujtojme nga leksioni i kaluar: type tip_elementi = integer ; peme = ^nyje_peme; nyje_peme = record element : tip_elementi;
E N D
Pemet e Kerkimit Binar (vazhdim) Leksion 9
Ne kete leksion do te shohim disa veprime te tjera mbi pemet e kerkimit binar. • Rikujtojme nga leksioni i kaluar: type tip_elementi = integer; peme = ^nyje_peme; nyje_peme = record element : tip_elementi; lidhje : array [1..2] of peme; end; tabele_peme = record rrenja : peme; numri : integer; end;
function gjej (t : tabele_peme; var p, q : peme ; var d : integer ; elm : tip_elementi) : boolean ; {gjen vendndodhjen e nyjes se pemes me vlere elm ne pemen t duke ruajtur ne p} {shenjuesin mbi kete nyje peme (ose nil nese ajo nuk ekziston), ne q prindin e p (ose } {nil nese prindi nuk ekziston) dhe ne d kahun e birit (1 nese eshte bir i majte dhe/ose} {2 nese eshte bir i djathte)} var ugjet : boolean; begin ugjet := false; p := t.rrenja; q := nil ; while (not(ugjet) and (p <> nil)) do if p^.element = elm then ugjet := true else begin if p^.element > elm then d := 1 else d := 2; q := p; p := p^.lidhje[d] end ; gjej := ugjet end {gjej};
function hiq (var t : tabele_peme; elm : tip_elementi) : boolean; {heq nyjen e pemes me vlere elm ne pemen t (nese nje nyje } { e tille ekziston) dhe ben rregullimet e duhura ne menyre qe } { pema te gezoje perseri vetite e pemeve te kerkimit binar; } { kthen true nese veprimi i heqjes perfundon me sukses dhe } { false ne te kundert } var {p nyja per tu hequr; q prindi i p; r biri i djathte i p; s pasardhesi nderrendor i p} p, q, r, s : peme ; d : integer ; begin {hiq} {inicializimi} p := nil; q := nil; r := nil; s := nil; d := 0;
{gjetja e nyjes kandidate per tu hequr, prindit te saj dhe kahut te zbritjes nga prindi} {nepermejt funksionit gjej} if gjej(t, p, q, d, elm) then begin if p^.lidhje[2] = nilthen {rasti 1 ku p nuk ka bir te djathte} if q <> nilthen q^.lidhje[d] := p^.lidhje[1] else {nese p nuk ka prind atehere p eshte rrenja e pemes} t.rrenja := p^.lidhje[1] ; else begin r := p^.lidhje[2] ; if r^.lidhje[1] = nil then {rasti 2 ku biri i djathte i p nuk ka bir te majte} begin r^.lidhje[1] := p^.lidhje[1]; if q <> nilthen q^.lidhje[d] := r else {nese p nuk ka prind ateher p eshte rrenja e pemes} t.rrenja := r ; end
else {rasti 3 ku biri i djathte i p ka bir te majte} begin {s pasardhesi i p sipas bredhjes nderrendore dhe r prindi i s} s := r^.lidhje[1]; while s^.lidhje[1] <> nil begin r := s; s := r^.lidhje[1] end; r^.lidhje[1] := s^.lidhje[2]; s^.lidhje[1] := p^.lidhje[1]; s^.lidhje[2] := p^.lidhje[2]; if q <> nilthen q^.lidhje[d] := s else {nese p nuk ka prind atehere p eshte rrenja e pemes} t.rrenja := s ; end end; dispose(p) ; t.numri := t.numri – 1 ; hiq := true end else hiq := false; end {hiq};
procedure bredhje_rekursive (var t : tabele_peme); procedure bredhje_nder_rendore_rekursive (p : peme); {bredhje ne elementet e nenpemes p – metoda nderrendore (in-order) rekursive} begin { bredhje_nder_rendore_rekursive } ifnot bosh(p) then begin bredhje_nder_rendore_rekursive (p^.lidhje[1]) ; writeln (p^.element); bredhje_nder_rendore_rekursive (p^.lidhje[2]) ; end end { bredhje_nder_rendore_rekursive }; begin {bredhje_rekursive} bredhje_nder_rendore_rekursive(t.rrenja) end{bredhje_rekursive};
procedure bredhje_iterative (var t : tabele_peme); procedure bredhje_nder_rendore_iterative (p : peme); {bredhje ne elementet e nenpemes p – metoda nderrendore (in-order) iterative} var ps : array [1 . . max_lartesi_BST] of peme; n : peme; h : integer; fund : boolean; begin {bredhje_nder_rendore_iterative} n := p; h :=1; fund := false; whilenot(fund) do begin {while not(fund) do} while n <> nildo begin {while n <> nil do} ps[h] := n; h := h +1; n := n^.lidhje[1] end {while n <> nil do};
if h = 1 then fund := true else begin {else} h := h -1; n := ps[h]; writeln (n^.element); n := n^.lidhje [2]; end {else}; end {while not(fund) do}; end {bredhje_nder_rendore_iterative}; begin {bredhje_iterative} bredhje_nder_rendore_iterative(t.rrenja) end{bredhje_iterative};
procedure shkaterro_BST (var t : tabele_peme); {shkaterron pemen t – metoda e rirregullimit te pemes BST duke i rrotulluar nyjet} {derisa te mos kene nenpeme te majte} var p, q : peme; begin {shkaterro_BST} q := nil; p := t.rrenja; while p<>nildo begin {while p <>nil do} if p^.lidhje[1] = nilthen begin q := p^.lidhje[2]; dispose(p) end else begin q := p^.lidhje[1] ; {q bir i majte i p} p^.lidhje[1] := q^.lidhje[2] ; {rrotullo djathtas mbi p} q^.lidhje[2] := p {p asnjehere nuk ka prind} end ; p :=q end {while p <>nil do} end {shkaterro_BST};
function prindi (t : tabele_peme; p : peme) : peme; {kthen prindin e nyjes p ne pemen t ose nil nese ai nuk ekziston (p=rrenja)} var q, n : peme; ugjet : boolean; begin {prindi} ugjet := false; if ((t.rrenja <> nil) and (p<>nil)) then begin {if ((t.rrenja <> nil) and (p<>nil)) then} q := nil; n := t.rrenja ; while (not(ugjet) and (n <> nil)) do if n = p then ugjet := true else begin if n^.element < p^.element then d := 1 else d := 2; q := n ; n := n^.lidhje[d] end ; end {if ((t.rrenja <> nil) and (p<>nil)) then}; if ugjet then prindi := q else prindi := nil end {prindi};
function rrotullo (var t : tabele_peme; x, y : peme; kahu : integer) : boolean; {kryen rrotullim majtas mbi nyjen x te pemes t nese kahu=1 dhe/ose kryen rrotullim} {djathtas mbi nyjen y te pemes t nese kahu=2; kthen true nese veprimi i rrotullimit} {perfundon me sukses dhe false ne te kundert} var {p prindi i x dhe/ose y; d kahu i zbritjes ne peme me reference madhesie p^.element} p : peme ; d : integer ; begin {rrotullo} if ((t.rrenja<>nil) and (x<>nil) and (y<>nil)) then if kahu=1 then {rrotullo majtas mbi x} begin {rrotullo majtas mbi x} p := prindi(t, x); if p<>nil then begin if p^.lidhje[1]=x then d := 1 else d:= 2; p^.lidhje[d] := y ; end else {ndrysho rrenjen e pemes} t.rrenja := y; x^.lidhje[2] := y^.lidhje[1] ; y^.lidhje[1] := x ; rrotullo := true; end {rrotullo majtas mbi x}
elseif kahu=2 then {rrotullo djathtas mbi y} begin { rrotullo djathtas mbi y } p := prindi(t, y); if p<>nil then begin if p^.lidhje[1]=y then d := 1 else d:= 2; p^.lidhje[d] := x ; end else {ndrysho rrenjen e pemes} t.rrenja := x; y^.lidhje[1] := x^.lidhje[2] ; x^.lidhje[2] := y ; rrotullo := true; end {rrotullo djathtas mbi y}; else rrotullo := false; else rrotullo := false; end {rrotullo};