estrutura de 'r#ore usando recursi#idade Estrutura de rvores
Uma 'r#ore com"osta "or um con*unto de n(s.
E!iste um n( r+ denominado raiz+ %ue contm ,ero ou
mais su-.'r#ores+ cu*as ra/,es so li0adas a r.
Esses n(s ra/,es das su-.'r#ores so ditos filhos do n(
pai+ no caso r.
$(s com filhos so comumente chamados de ns
internos e n(s %ue no t1m filhos so chamados de folhas+ ou n(s e!ternos. Estrutura de rvores Por adotarmos essa forma de representao grfica, no representamos explicitamente a direo dos ponteiros, subentendendo que eles apontam sempre do pai para os filhos. Tipos de rvores
2 n3mero de filhos "ermitido "or n( o %ue diferencia
os di#ersos ti"os de 'r#ores e!istentes.
Estudaremos as 'r#ores -in'rias+ onde cada n( tem+ no
m'!imo+ dois filhos.
Estruturas recursi#as sero usadas como -ase "ara o
estudo e a im"lementa4o das o"era45es com 'r#ores. RVOR! "#$R#%! rvore Binria
Um e!em"lo de utili,a4o de 'r#ores -in'rias
est' na a#alia4o de e!"ress5es.
Como tra-alhamos com o"eradores %ue es"eram
um ou dois o"erandos+ os n(s da 'r#ore "ara re"resentar uma e!"resso t1m no m'!imo dois filhos.
$essa 'r#ore+ os n(s folhas re"resentam
o"erandos e os n(s internos o"eradores. rvores Binrias sta r&ore representa a expresso '()*+,'-./+)0 Estrutura de uma AB
$uma 'r#ore -in'ria+ cada n( tem ,ero+ um ou
dois filhos.
De maneira recursi#a+ "odemos definir uma
'r#ore -in'ria como sendo&
uma 'r#ore #a,ia6 ou
um n( rai, tendo duas su-.'r#ores+ identificadas como a
su-.'r#ore da direita (sad) e a su-.'r#ore da es%uerda (sae). Estrutura de uma AB Estrutura de uma AB
2s n(s a+ b+ c+ d+ e+ f formam uma 'r#ore -in'ria
da se0uinte maneira&
A 'r#ore com"osta do n( a+ da su-'r#ore 7
es%uerda formada "or b e d+ e da su-.'r#ore 7 direita formada "or c+ e e f.
2 n( a re"resenta a rai, da 'r#ore e os n(s b e c
as ra/,es das su-.'r#ores.
Finalmente+ os n(s d+ e e f so folhas da 'r#ore.
Descrio de AB
Uma su-.'r#ore de uma 'r#ore -in'ria sem"re
es"ecificada como sendo a sae ou a sad de uma 'r#ore maior+ e %ual%uer das duas su-.'r#ores "ode ser #a,ia.
As duas 'r#ores da Fi0ura a-ai!o so distintas.
Altura de uma AB
Uma "ro"riedade fundamental de todas as 'r#ores
%ue s( e!iste um caminho da rai, "ara %ual%uer n(.
Podemos definir a altura de uma 'r#ore como
sendo o com"rimento do caminho mais lon0o da rai, at uma das folhas.
A altura de uma 'r#ore com um 3nico n( rai,
,ero e+ "or conse0uinte+ di,emos %ue a altura de uma 'r#ore #a,ia ne0ati#a e #ale .8. Exemplos: Alturas e Nveis Nvel 0 Nvel 1 Nvel 2 Nvel 3 Tipos de rvores: Ceia Ns intermedirios com dois filhos. Tipos de rvores: !er"eita Todos os Ns folhas esto no mesmo nvel Tipos de rvores: Completa 1 rvore perfeita at o nvel h-1 1 Na nvel h os ns esto dispostos da es!"erda para a direita RVOR! "#$R#%! 2 "3!4% Introduo
Dicion'rio din9mico& Inser4o+ remo4o e :usca em tem"o
(timo6
;' sa-emos %ue a estrutura de #etor no ade%uada "ara
im"lementar dicion'rios din9micos.
Para inserirmos um no#o elemento num #etor ordenado+ temos %ue
rearrumar os elementos no #etor6
<itua4o an'lo0a ocorre %uando remo#emos um elemento do
#etor.
Precisamos "ortanto de uma estrutura din9mica %ue d1 su"orte a
o"era45es de -usca. !ropriedade
Em uma rvore binria, o valor associado raiz sempre maior que o valor associado a qualquer n da sub-rvore esquerda (sae), e sempre menor que o valor associado a qualquer n da sub-rvore direita (sad). A #usca: Como$
Para "rocurar um #alor numa 'r#ore+ com"aramos o
#alor %ue -uscamos com o #alor associado 7 rai,.
Em caso de i0ualdade
o #alor foi encontrado6
<e o #alor "rocurado for menor %ue o #alor da rai,
a -usca continua na sae6
<e o #alor "rocurado for maior %ue o #alor da rai,
a -usca continua na sad.
Por essa ra,o+ estas 'r#ores so chamadas de rvores
binrias de busca. A #usca: Como$ %cont&
<e a informa4o a ser arma,enada em cada n( da
'r#ore for um n3mero inteiro "odemos usar os o"eradores relacionais (=>?+ =@?+ =A?).
Porm+ se ti#ermos %ue considerar casos em %ue a
informa4o mais com"le!a+ a fun4o de com"ara4o de#e ser definida "elo "ro0ramador+ es"ecificamente "ara cada caso. Tipo da rvore Binria typedef struct tipoNo { int valor; struct tipoNo *esq; struct tipoNo *dir; } tipoNo; Busca: !rocurando o valor ' (perao de Busca TArvore busca (TArvore r, int v) { if (r == NU) return NU; else if (r!"info " v) return busca(r!"esq,v); else if (r!"info # v) return busca(r!"dir,v); else return r; } Insero: Inserindo o valor ) Insero: Exerccio
Im"lemente a fun4o de inser4o em uma 'r#ore
-in'ria (utros Exerccios
Im"lemente uma fun4o %ue retorne o menor
elemento de uma 'r#ore -in'ria
Im"lemente uma fun4o %ue retorne o maior
elemento de uma 'r#ore -in'ria
Im"lemente uma fun4o %ue retorne o n3mero de
n(s de uma 'r#ore -in'ria
Im"lemente uma fun4o %ue calcule a altura de
uma 'r#ore -in'ria
Im"lemente uma fun4o de -usca. Bual a
com"le!idade dessa fun4oC (perao de *emoo
E!istem tr1s situa45es "oss/#eis&
A "rimeira %uando se dese*a retirar um elemento %ue
folha da 'r#ore.
A se0unda situa4o acontece %uando o n( a ser retirado
"ossui um 3nico filho.
A terceira situa4o ocorre %uando o n( a ser
retirado tem dois filhos. (perao de *emoo !rimeira +ituao #etira folha 3 (perao de *emoo +e,unda +ituao (perao de *emoo !rimeira e +e,unda +itua-es
A "rimeira+ e mais sim"les+ %uando se dese*a
retirar um elemento %ue folha da 'r#ore. $este caso+ -asta retirar o elemento da 'r#ore e atuali,ar o "ai+ "ois seu filho no e!iste mais.
A se0unda situa4o+ ainda sim"les+ acontece
%uando o n( a ser retirado "ossui um 3nico filho. Para retirar esse elemento necess'rio antes acertar o "onteiro do "ai+ ="ulando? o n(& o 3nico neto "assa a ser filho direto. (perao de *emoo Terceira +ituao (perao de *emoo Terceira +ituao 1 $ocali%ar o n a ser eliminado &n '( 1 )ncontrar o n de maior valor na sae 1 * o n mais a direita da sae &n +( 1 Trocar os valores entre o n a ser eliminado e o n encontrado. 1 $ocali%ar novamente o n a ser eliminado &n '( (perao de *emoo Terceira +ituao
Para "oder retirar esse n( da 'r#ore+ de#emos
"roceder da se0uinte forma&
encontramos o elemento %ue "recede o elemento a ser
retirado na ordena4o. Isto e%ui#ale a encontrar o elemento mais 7 direita da su-.'r#ore 7 es%uerda6
trocamos a informa4o do n( a ser retirado com a
informa4o do n( encontrado6
retiramos no#amente o n( encontrado (%ue a0ora
contm a informa4o do n( %ue se dese*a retirar).
2-ser#a.se %ue retirar tal n( a0ora tri#ial+ "ois esse
um n( folha ou um n( com um 3nico filho. (perao de *emoo TArvore retira (TArvore r, int v) { if (r == NU) return NU; else if (r!"info " v) r!"esq = retira(r!"esq, v); else if (r!"info # v) r!"dir = retira(r!"dir, v); else { $* ac%ou o ele&ento *$ ''' (perao de *emoo ''' else { $* ac%ou o ele&ento *$ $* ele&ento se& fil%os *$ if (r!"esq == NU (( r!"dir == NU) { free (r); r = NU; } $* s) te& fil%o * direita *$ else if (r!"esq == NU) { TArvore t = r; r = r!"dir; free (t); } $* s) te& fil%o * esquerda *$ else if (r!"dir == NU) { TArvore t = r; r = r!"esq; free (t); } ''' (perao de *emoo ''' $* te& os dois fil%os *$ else { TArvore f = r!"esq; +%ile (f!"dir ,= NU) { f = f!"dir; } $* troca as infor&a-.es *$ r!"info = f!"info; f!"info = v; r!"esq = retira(r!"esq,v); } } return r; } ( .I/ Per0untasCCC