Fonts Biliográis Estruturs Dos Aul 15: Árvors 24/05/2009 Livros: Introução Estruturs Dos (Cls, Crquir Rngl): Cpítulo 13; Projto Algoritmos (Nivio Zivini): Cpítulo 5; Estruturs Dos sus Algoritmos (Szwritr, t. l): Cpítulo 3; Algorithms in C (Sgwik): Cpítulo 5; Slis sos no mtril PUC-Rio, isponívl m http://www.in.purio.r/~in1620/. Introução Estruturs stus té gor não são qus pr rprsntr os qu vm sr ispostos mnir hirárqui Ex., hirrqui psts Árvor gnlógi Árvors são struturs qus pr rprsntção hirrquis Dinição Rursiv Árvor Um onjunto nós tl qu: xist um nó r, nomino riz, om zro ou mis suárvors, ujs rízs stão ligs r os nós rízs sts su-árvors são os ilhos r os nós intrnos árvor são os nós om ilhos s olhs ou nós xtrnos árvor são os nós sm ilhos
Forms rprsntção Rprsntção por prêntss ninhos ( A (B) ( C (D (G) (H)) (E) (F (I)))) Digrm Inlusão Rprsntção Hirárqui Suárvor Sj árvor im T = A, B,... A árvor T possui us suárvors: T T on T = B T = C, D,... A suárvor T possui 3 suárvors: T, T T on T = D, G, H, T = F, I, T = E As suárvors T, T, Tg, Th, Ti possum pns o nó riz nnhum suárvor. Exmplo (árvor xprssão) Rprsntção xprssão ritméti: ( + ( * ( / - ))) Conitos Básios Nós ilhos, pis, tios, irmãos vô Gru sí (númro ilhos um nó) Nó olh (gru sí nulo) nó intrior (gru sí irnt nulo) Gru um árvor (máximo gru sí) Florst (onjunto zro ou mis árvors)
Conitos Básios (2) Cminho Um squêni nós istintos v1, v2,..., vk, tl qu xist smpr ntr nós onsutivos (isto é, ntr v1 v2, ntr v2 v3,..., v(k-1) vk) rlção "é ilho ou "é pi " é nomin um minho n árvor. Comprimnto o Cminho Um minho vk vértis é otio pl squêni k-1 prs. O vlor k-1 é o omprimnto o minho. Nívl ou prouni um nó númro nós o minho riz té o nó. Conitos Básios (3) Nívl riz (prouni) é 0. Árvor Orn: é qul n qul ilhos nó stão ornos. Assum-s ornção squr pr irit. Est árvor é orn? Conitos Básios (4) Árvor Chi: Um árvor gru é um árvor hi s possui o númro máximo nós, isto é, toos os nós têm númro máximo ilhos xto s olhs, tos s olhs stão n msm ltur. Árvor hi gru 2: implmntção squnil. Exmplo Árvor inári rprsntno xprssõs ritmétis ináris Nós olhs rprsntm os oprnos Nós intrnos rprsntm os oprors (3+6)*(4-1)+5 Armznmnto por nívl: posição o nó posição os ilhos o nó 1 2,3 2 4,5 3 6,7 i (2i,2i+1)
Árvors Bináris Notção txtul árvor vzi é rprsnt por <> árvors não vzis por <riz s s> Exmplo: < < <> <<><>> > < <<><>> <<><>>> > Árvor Binári Um árvor m qu nó tm zro, um ou ois ilhos Um árvor inári é: um árvor vzi; ou um nó riz om us su-árvors: suárvor irit (s) suárvor squr (s) Árvors Bináris Implmntção m C Rprsntção: pontiro pr o nó riz Rprsntção um nó n árvor: Estrutur m C ontno A inormção proprimnt it (xmplo: um rtr, ou intiro) Dois pontiros pr s su-árvors, à squr à irit strut rv hr ino; strut rv* sq; strut rv* ir; ; TAD Árvors Bináris Impl. m C (rv.h) typ strut rv Arv; //Cri um árvor vzi Arv* rv_rivzi (voi); //ri um árvor om inormção o nó riz, //om suárvor squr suárvor irit Arv* rv_ri (hr, Arv*, Arv* ); //lir o spço mmóri oupo pl árvor Arv* rv_lir (Arv* ); //rtorn tru s árvor stivr vzi ls //so ontrário int rv_vzi (Arv* ); //ini oorrêni (1) ou não (0) o rtr int rv_prtn (Arv*, hr ); //imprim s inormçõs os nós árvor voi rv_imprim (Arv* );
TAD Árvors Bináris Implmntção m C Implmntção s unçõs: implmntção m grl rursiv us inição rursiv strutur Um árvor inári é: um árvor vzi; ou um nó riz om us su-árvors: su-árvor irit (s) su-árvor squr (s) TAD Árvors Bináris Implmntção m C unção rv_rivzi ri um árvor vzi Arv* rv_rivzi (voi) rturn NULL; TAD Árvors Bináris Implmntção m C unção rv_ri ri um nó riz s inormção s us su-árvors, squr irit rtorn o nrço o nó riz rio Arv* rv_ri (hr, Arv* s, Arv* s) Arv* p=(arv*)mllo(sizo(arv)); p->ino = ; p->sq = s; p->ir = s; rturn p; TAD Árvors Bináris Implmntção m C rv_rivzi rv_ri s us unçõs pr rição árvors rprsntm os ois sos inição rursiv árvor inári: um árvor inári Arv* ; é vzi =rv_rivzi() é ompost por um riz us su-árvors =rv_ri(,s,s);
TAD Árvors Bináris Implmntção m C unção rv_vzi ini s um árvor é ou não vzi int rv_vzi (Arv* ) rturn ==NULL; TAD Árvors Bináris Implmntção m C unção rv_lir lir mmóri lo pl strutur árvor s su-árvors vm sr lirs nts s lirr o nó riz rtorn um árvor vzi, rprsnt por NULL Arv* rv_lir (Arv* ) i (!rv_vzi()) rv_lir(->sq); /* lir s */ rv_lir(->ir); /* lir s */ r(); /* lir riz */ rturn NULL; TAD Árvors Bináris Implmntção m C unção rv_prtn vrii oorrêni um rtr m um os nós rtorn um vlor oolno (1 ou 0) inino oorrêni ou não o rtr n árvor int rv_prtn (Arv*, hr ) i (rv_vzi()) rturn 0; /* árvor vzi: não nontrou */ ls rturn ->ino== rv_prtn(->sq,) rv_prtn(->ir,); TAD Árvors Bináris Implmntção m C unção rv_imprim prorr rursivmnt árvor, visitno toos os nós imprimino su inormção voi rv_imprim (Arv* ) i (!rv_vzi()) print("% ", ->ino); /* mostr riz */ rv_imprim(->sq); /* mostr s */ rv_imprim(->ir); /* mostr s */
Exmplo Crir árvor < < <> < <><>> > < < <><> > < <><> > > > Exmplo Crir árvor < < <> < <><>> > < < <><> > < <><> > > > /* su-árvor '' */ Arv* 1= rv_ri('',rv_rivzi(),rv_rivzi()); /* su-árvor '' */ Arv* 2= rv_ri('',rv_rivzi(),1); /* su-árvor '' */ Arv* 3= rv_ri('',rv_rivzi(),rv_rivzi()); /* su-árvor '' */ Arv* 4= rv_ri('',rv_rivzi(),rv_rivzi()); /* su-árvor '' */ Arv* 5= rv_ri('',3,4); /* árvor '' */ Arv* = rv_ri('',2,5 ); Arv* = rv_ri(, rv_ri(, rv_rivzi(), rv_ri(, rv_rivzi(), rv_rivzi()) ), rv_ri(, rv_ri(, rv_rivzi(), rv_rivzi()), rv_ri(, rv_rivzi(), rv_rivzi()) ) ); Exmplo Exmplo Arsnt nós x, y z Lir nós ->sq->sq = rv_ri( x, rv_ri( y, rv_rivzi(), rv_rivzi()), rv_ri( z, rv_rivzi(), rv_rivzi()) ); x ->ir->sq = rv_lir(->ir->sq); x y z y z
Orm Prurso (ou trvssi) Árvors Bináris Pré-orm: trt riz, prorr s, prorr s xmplo: Orm simétri (ou In-Orm): prorr s, trt riz, prorr s xmplo: Pós-orm: prorr s, prorr s, trt riz xmplo: Orm Prurso - Exríios Fzr prurso Pré-orm In-orm Pós-orm Pr-orm +*+36-415 In-orm 3+6*4-1+5 Pós-orm 36+41-*5+ Pré-Orm Implmntção rursiv In-Orm Implmntção rursiv voi rv_prorm (Arv* ) i (!rv_vzi()) pross(); // por xmplo imprim rv_prorm(->sq); rv_prorm(->ir); voi rv_inorm (Arv* ) i (!rv_vzi()) rv_inorm (->sq); pross (); // por xmplo imprim rv_inorm (->ir);
Pós-Orm Implmntção rursiv voi rv_posorm (Arv* ) i (!rv_vzi()) rv_posorm (->sq); rv_posorm (->ir); pross (); // por xmplo imprim Prgunt unção rv_prtn Pré-orm, pós-orm ou in-orm? int rv_prtn (Arv*, hr ) i (rv_vzi()) rturn 0; /* árvor vzi: não nontrou */ ls rturn ->ino== rv_prtn(->sq,) rv_prtn(->ir,); Prgunt unção rv_lir Pré-orm, pós-orm ou in-orm? Arv* rv_lir (Arv* ) i (!rv_vzi()) rv_lir(->sq); /* lir s */ rv_lir(->ir); /* lir s */ r(); /* lir riz */ rturn NULL; Árvors Bináris - Altur Propri s árvors Exist pns um minho riz pr qulqur nó Altur um árvor omprimnto o minho mis longo riz té um s olhs ltur um árvor om um únio nó riz é zro ltur um árvor vzi é -1 Esorço omputionl nssário pr lnçr qulqur nó árvor é proporionl à ltur árvor Exmplo: h = 2
Árvors Bináris - onitos Nívl um nó riz stá no nívl 0, sus ilhos irtos no nívl 1,... o último nívl árvor é ltur árvor Árvors Bináris - onitos Árvor Chi toos os sus nós intrnos têm us su-árvors ssois númro n nós um árvor hi ltur h n = 2 h+1-1 nívl 0 nívl 1 nívl 2 Árvors Bináris - onitos Árvor Dgnr Nós intrnos têm um úni suárvor ssoi Vir um strutur linr Arvor ltur h tm n = h+1 Exríios Esrvr um unção rursiv qu lul ltur um árvor inári. A ltur um árvor é igul o máximo nívl sus nós. Altur um árvor Importnt mi iiêni (visitção o nó) Árvor om n nós: Altur mínim proporionl log n (árvor inári hi) Altur máxim proporionl n (árvor gnr)
Rsposts stti int mx2 (int, int ) rturn ( > )? : ; int rv_ltur (Arv* ) i (rv_vzi()) rturn -1; ls rturn 1 + mx2 (rv_ltur (->sq), rv_ltur (->ir)); Exríios Esrvr o lgoritmo visit m Pré-Orm utilizno loção inâmi ms sm utilizr proimntos rursivos. Utilizr pilh (inino um vtor qu po sr sso plo topo) pr sr o nrço suárvor qu rst à irit. prossr riz A gurr A n pilh pr por ssr C pois pss à B pross ss suárvor im pr D rtorn B (topo pilh) pr ssr D qu é suárvor squr Rsposts voi rv_prorm (Arv* ) Arv* A[MAX]; //qul sri o vlor mx? Arv* p; Arv* riz; int topo; int ou; topo = 0; p = ; ou = rv_vzi(); //iniilizçõs whil (!ou) // nqunto houvr nós pr prossr whil (!rv_vzi(p)) pross (p->ino); topo++; A[topo] = p; p = p->sq; i (topo!= 0) p = A[topo]->ir; topo--; ls ou = 1; Pr s Fzr unção pr rtornr o pi um o nó um árvor Do um itm, prour s itm xist n árvor (usno lgum lgoritmo trvssi) Cso positivo rtorn o ontúo o pi o nó Po sr rursivo ou não