Free Web Site - Free Web Space and Site Hosting - Web Hosting - Internet Store and Ecommerce Solution Provider - High Speed Internet
Search the Web
  Arbori Binari
     
Arbori - Introducere

Arbori partiali de cost minim

Arbori Binari

Probleme rezolvate

 
Introducere

     Un arbore binar este un arbore orientat în care fiecare vârf are cel mult doi descendenti, făcându-se însă distincţie clară între descendentul drept şi descendentul stâng al fiecărui vârf. Se acceptă şi arborele binar cu 0 vârfuri.
     Arborii binari nu reprezintă cazuri particulare de arbori orientaţi, decât dacă se face abstracţie de distincţia menţionată între descendentul drept şi cel stâng al fiecărui vârf. Într-adevăr dacă un vârf are un singur descendent, această informaţie este suficientă în cazul unui arbore, dar insuficientă în cazul unui arbore binar, când trebuie precizat dacă acest descendent este descendent stâng sau descendent drept.

Definire. Reprezentare.

 Prezentăm în continuare cîteva modalităţi de definire a arborilor binari in Haskell.

                data Tree a = Nil | T(Tree a, a, Tree a)

                data Tree a = Nil | T Tree a a Tree a
        Pentru a afişa structurile de date arborescente intr-un mod similar cu listele sau tipurile de date simple, este necesara extinderea clasei Show, prin intermediul căreia se realizează afişarea datelor la consola.

-- Extinderea clasei Show
                      instance Show a => Show (Tree a) where
                      show Nil = "Nil"
                      show (T(l,n,r)) = " T( " ++ show l ++ ", " ++ show n ++ ", " ++ show r ++ ") "


       Într-o structură de tip arbore, elementele sunt structurate pe nivele ; pe primul nivel, numit nivel 0, există un singur element numit rădăcină, de care sunt legate mai multe elemente numite fii care formează nivelul 1; de acestea sunt legate elementele de pe nivelul 2 ş. a. m. d. ( vezi figura ).

 

       Un arbore este compus din elementele numite noduri sau vârfuri şi legăturile dintre acestea. Un nod situat pe un anumit nivel este nod tată pentru nodurile legate de el, situate pe ivelul următor, acestea reprezentând fiii săi. Fiecare nod are un singur tată, cu excepţia rădăcinii care nu are tată. Nodurile fără fii se numesc noduri terminale sau frunze. Termenii ' nod tată', 'fiu' sau 'frate' sunt preluaţi de la arborii genealogici, cu care arborii se aseamănă foarte mult.
       Arborii, ca structuri dinamice de date, au extrem de multe aplicaţii în informatică. Deosebit de utilizatăîn aplicaţii este structura de tip arbore binar. Un arbore binar este un arbore în care fiecare nod are cel mult doi fii, fiul stâng şi fiul drept (fiul stâng este legat în stânga tatălui şi cel drept în dreapta ).
Dacă în figură se elimină rădăcina şi legăturile ei, se obţin doi arbori binari care se numesc subarborii stâng şi drept ai arborelui iniţial. Arborele binar este, deci, o structură recursivă de date. Un arbore binar nevid fie se reduce la rădăcină, fie cuprinde rădăcina şi, cel mult, doi subarbori binari. Un arbore binar se poate implementa foarte uşor cu ajutorul adreselor de înlănţuire, fiecare element cuprinzând, în afară de informaţia proriu-zisă asociată nodului, adresa fiului stâng şi adresa fiului drept, acestea exprimând legăturile existente între noduri.


 

Implementarea arborilor binari


     Dacă se recurge la implementarea arborilor prin structuri dinamice, atunci această constantă se reprezintă prin NIL. Tipul informaţiilor ataşate nodurilor dintr-un arbore este specific fiecărei aplicaţii în parte. Din acest motiv, vom considera că informaţia ataşată fiecărui nod este adrestă indirect prin intermediul unui pointer. În majoritatea implementărilor şi cei doi subarbori sunt adresaţi indirect; în funcţie de varianta de implementare - dinamică sau statică - , adresarea se realizează fie prin intermediul pointerilor, fie prin intermediul indicilor de tablou.
    Alegem implementarea dinamică cea mai simplă formă de reprezentare a nodurilor :

Type

   NodPtr =^.Nod ;

   Nod = record

    info: string ;
 
    stânga: NodPtr ;

    dreapta: NodPtr ;

end

Var
   rădăcina : NodPtr ;

                                                                


Operaţii:


  Operaţiile posibile cu arbori sunt la fel ca în cazul listelor:

  traversarea arborelui ;

  inserarea unui nod ;

  căutarea unui nod ;

  ştergerea unui nod ;

Traversarea arborelui binar constă în parcurgerea pe rând a nodurilor în vederea prelucrării informaţiilor ataşate acestora. Traversarea arborelui presupune vizitarea fiecărui nod o singură dată, operaţie echivalentă cu o liniarizare a arborelui.
  Există trei modalităţi importante de trvesare a unui arbore binar :
1.) în preordine : sevizitează rădăcina, apoi tot în preordine se vizitează nodurile subarborelui stâng şi apoi acelea ale subarborelui drept.
    Nodurile arborelui din figura 2 vizitate în preordine, sunt :
                          1 2 4 5 3 6 7 8.

2.) în inordine : se viziteză în inordine nodurile subarborelui stâng, apoi rădăcina şi apoi tot în inordine, nodurile subarborelui drept.
Nodurile arborelui din figura 2 vizitate în inordine, sunt :
                         4 5 2 1 6 3 8 7.

3.) în postordine : se viziteză în postordine nodurile subarborelui stâng, apoi tot în postordine, nodurile subarborelui drept şi, la sfârşit, rădăcina.
Nodurile arborelui din figura 2, vizitate în postordine, sunt :
                         5 4 2 6 8 7 3 1.

Observaţii :

  1. evident, dacă arborele se reduce la un singur nod, vizitarea acestuia în preordine, inordine sau postordine presupune parcurgerea acestuia, deci prelucrarea informaţiilor asociate lui;
  2. cele trei modalităţi de traversare diferă prin, momentul în care se vizitează rădăcina şi anume, în cazul :
  3. preordinii : se vizitează întâi rădăcina, apoi subarborele stâng şi după aceea cel drept ( RSD );
  4. inordinii : se vizitează rădăcina, după vizitarea subarborelui stâng ( SRD );
  5. postordinii : se vizitează rădăcina la sfârşit, după vizitarea subarboreui stâng şi a celui drept ( SDR);

                                      

Parcurgeri (preordine, inordine, postordine).

    Pentru fiecare caz, rezultatul funcţiilor îl constituie lista nodurilor din arbore într-o anumită ordine.

    Ex. 1. Parcurgerea unui arbore binar in preordine.
                                                                             preordine :: Tree a -> [a]
                                                                             preordine (T(l, n, r)) = [n] ++ preordine l ++ preordine r
                                                                             preordine Nil = []

    Ex. 2. Parcurgerea unui arbore binar in postordine.
                                                                
postordine :: Tree a -> [a]
                                                                             postordine (T(l, n, r)) = postordine l ++ postordine r ++ [n]
                                                                             postordine Nil = []

    Ex. 3. Parcurgerea unui arbore binar in inordine.
                                                               
inordine :: Tree a -> [a]
                                                                             inordine (T(l, n, r)) = inordine l ++ [n] ++ inordine r
                                                                             inordine Nil = []

Arbori binari de căutare.

    Cheile unui arbore binar de căutare satisfac proprietatea arborelui binar de căutare :

    Fie x un nod dintr-un arbore binar de căutare. Dacă y este un nod din subarborele stîng al lui x, atunci cheie[y]<=cheie[x]. Dacă y este un nod din subarborele drept al lui x, atunci cheie[x] <= cheie[y].

        Proprietatea arborelui binar de căutare ne permite să afişăm toate cheile în ordine crescătoare, parcurgînd nodurile arborelui în inordine.

    Ex. 4. Săse scrie o funcţie care inserează un nod într-un arbore binar de căutare.    

                                                                                searchtree :: Tree Int-> Int -> Tree Int
                                                                                searchtree (T(l,k,r)) x = if x<=k then (T(searchtree l x, k, r))
                                                                                else (T(l, k, (searchtree r x)))
                                                                                searchtree Nil k = (T(Nil,k,Nil))

    Ex. 5. Să se scrie o funcţie care construieşte un arbore binar de căutare dintr-o lista de chei.

listtree :: [Int] -> Tree Int -> Tree Int
listtree [] Nil = Nil
listtree [] (T(l,n,r)) = (T(l,n,r))
listtree (x:xs) y = listtree xs (searchtree y x)

Concluzie: După studierea referatului am făcut cunoştinţă cu noţiunea despre arbore binar, şi anume definirea acestuia; reprezentarea,; implementarea. Am făcut cunoştinţă despre metodele de operaţii, acestea sunt traversarea arborelui, inserarea unui nod, căutarea unui nod şi ştergerea unui nod; parcurgerile cu arborii binar, iar în cele din urmă am definit arborele binar de căutare. Acum ne va fi mai uşor de folosi în cursul de informatică şi materialul din acest referat şi deasemenea ne deschide noi orizonturi în domeniul informaticii.


Pagina principala