Anda di halaman 1dari 23

!

Unidade I rvores e rvores Binrias 1.1 Conceitos Fundamentais


Definio: uma rvore um conjunto finito constitudo de um ou mais ns, de modo que h um n especial chamado raiz e os ns remanescentes so divididos em n 0 conjuntos disjuntos !, ",###, n, onde cada um destes conjuntos uma rvore $ou, mais apropriadamente, uma sub-rvore%# &'serve que, de forma anlo(a ) definio de listas (enerali*adas, esta definio tam'm recursiva# +ma rvore pode ser representada esquematicamente como na fi(ura se(uinte: A

,o e-emplo acima, A a rai* da rvore, que, por sua ve*, possui tr.s su'/rvores cujas ra*es so B, C e D# $,ormalmente, a rai* de uma rvore desenhada no topo da mesma#% e-i(.ncia de que os conjuntos $su'/ rvores% sejam disjuntos, na definio de rvore, impede que haja li(ao entre uma su'/rvore e outra $por e-emplo, uma li(ao entre D e F no permitida%# 0rios termos so freq1entemente utili*ados quando se fa* refer.ncia a rvores2 a se(uir, ver/se/o al(uns deles# +m n de uma rvore consiste de um item de informao mais as ramifica3es para outros itens# rvore do e-emplo acima possui !4 ns, cujos campos de informao so representados por letras e as ramifica3es por se(mentos de reta# & grau de um n o n5mero de su'/rvores do n# ,o e-emplo acima, o (rau do n A 4, o (rau do n B " e o (rau do n J 0# &s ns cujos (raus so i(uais a *ero $i#e#, aqueles que no possuem nenhuma su'/rvore% so denominados ns-folhas $ou, simplesmente, folhas% ou ns terminais# &s ns que no so folhas so denominados de ns n o-terminais# s ra*es das su'/rvores de um n X so denominadas filhos de X# ,este 5ltimo caso, X chamado de !ai de seus ns/filhos# ssim, no e-emplo acima, os filhos de B so E e F, e o pai de B A# &s filhos de um mesmo pai so ditos serem irm os# & grau de uma rvore o maior dentre os (raus de todos os ns da rvore# & (rau da rvore do e-emplo acima 4# &s ancestrais de um n so todos os ns ao lon(o do caminho que vai da rai* at este n $sem inclu/lo%# ,o e-emplo acima, os ancestrais de L so A, B e E# & n"vel de um n X definido como!: !, se X rai* nvel(X) = n + 1, se o nvel do pai de X n

,a rvore do e-emplo, o nvel do n A !, o nvel dos ns B, C e D ", e assim por diante# !rofundidade ou altura de uma rvore o nvel m-imo encontrado em al(um n da rvore# profundidade da rvore do e-emplo acima 6 $correspondendo ao nvel dos ns K, L e M%# +ma floresta definida como sendo um conjunto de n 0 rvores disjuntas# &'serve que a noo de floresta muito pr-ima da prpria noo de rvore# 7or e-emplo, se a rai* da rvore do e-emplo acima fosse removida, ter/se/ia uma floresta com tr.s rvores, cujas ra*es seriam B, C e D# 8nversamente, se as ra*es das rvores que formam uma floresta forem unidas por um n adicional ter/se/ uma rvore#

l(uns autores consideram o nvel da rai* como sendo 0#

"

9 vrias formas de representar/se (raficamente uma rvore, alm daquela vista no e-emplo acima# +ma forma 5til a representao em forma de lista# ,este esquema, a rvore do e-emplo acima seria representada como: (A(B(E(K,L),F),C(G),D(H(M),I,J))) &utra forma menos utili*ada para representar (raficamente uma rvore usando endentao para refletir as rela3es entre os ns"# +sando este tipo de representao a rvore do e-emplo seria representada como: A B E F C D G H I J M K L

1.# rvores Binrias


+ma rvore binria uma estrutura do tipo rvore $i#e#, hierrquica%, onde o (rau de cada n no m-imo i(ual a dois $em outras palavras, cada n tem no m-imo duas ramifica3es%# lm disso, numa rvore 'inria, fa*/se distino entre a su'/rvore da esquerda e a su'/rvore da direita de um n# +ma rvore 'inria tam'm pode ser va*ia, i#e#, no possuir nenhum n# definio formal : uma rvore 'inria um conjunto de ns que ou va*io ou consiste de uma rai* e duas rvores 'inrias disjuntas denominadas de su'/rvore direita e su'/ rvore esquerda# :onfronte as defini3es de rvore e de rvore 'inria, e o'serve que e-istem diferenas entre rvores e rvores 'inrias# ,ote que pode e-istir rvore 'inria va*ia, enquanto no pode e-istir rvore va*ia# s duas rvores 'inrias se(uintes so diferentes: A A

primeira destas rvores tem uma su'/rvore direita va*ia e a se(unda tem uma su'/rvore esquerda va*ia# ;e estas estruturas fossem consideradas como rvores ao invs de rvores 'inrias, elas seriam i(uais# terminolo(ia vista antes para rvores $(rau, nvel, profundidade, pai, filho, etc#% aplica/se naturalmente )s rvores 'inrias# l(uns resultados importantes relativos a rvores 'inrias sero vistos em se(uida# $ro!osi% o 1 &'ema() $i% & n5mero m-imo de ns no nvel i de uma rvore 'inria 2i-1, i 12 $ii% & n5mero m-imo de ns numa rvore 'inria de profundidade k 2k - 1, k 1# $rova) $i% prova feita por induo so're i# 7ara i < !, tem/se que 2i-1 = 21-1 = 1, pois s h um n no nvel !: a rai*# ;uponha a(ora que a equao dada em $i% seja vlida para i = n2 isto , que o n5mero m-imo de ns no nvel n dado por: 2n-1
"

:onstruir esta representao usando um editor de te-to trivial# ;implesmente, usa/se ta'ulao para representar o nvel de cada n, considerando a rai* como nvel 0# ssim, considerando a rvore do e-emplo, o n A no ter ta'ulao2 os ns B, C e D tero uma ta'ulao2 os ns E, F, G, H, I e J tero duas ta'ula3es, e assim por diante#

=nto, deve/se mostrar que esta equao tam'm vale para i = n +1, ou seja, que o n5mero m-imo de ns no nvel n + 1 dado por: 2n &ra, como cada n tem no m-imo (rau ", ento o n5mero m-imo de ns no nvel n + 1 " ve*es o n5mero m-imo de ns no nvel n, isto , 2 2n-1 = 2n# ssim,a parte $i% da proposio est provada# $ii% & n5mero m-imo de ns numa rvore 'inria de profundidade > o somatrio do n5mero m-imo de ns em todos os nveis da rvore, ou seja: k

i=1 *+erc"cio:

2i-1 = 2k - 1

prova desta 5ltima i(ualdade pode tam'm ser feita por induo# Demonstre isto#

$ro!osi% o #: 7ara qualquer rvore 'inria B, se n! o n5mero de ns terminais $folhas% e n2 o n5mero de ns de (rau ", ento n! = n2 + 1# $rova: ;eja n1 o n5mero de ns de (rau ! e n o n5mero total de ns# +ma ve* que todos os ns t.m (rau ? " tem/se que: n = n! + n1 + n2 $!%

(ora, cada n, e-ceto a rai*, possui um ramo que o li(a a seu n/pai# =nto, se " o n5mero de ramos, tem/se n = " + 1# @as, cada ramo parte de um n de (rau um ou de um n de (rau dois# ssim, " = n1 + 2n2 e, portanto, n = 1 + n1 + 2n2 De $!% e $"%, vem o resultado desejado: n! = n2 + 1 ,.e.d. $"%

+ma rvore 'inria de profundidade k que possui o n5mero m-imo possvel de ns $dado pelo Aema ! por 2k - 1% denominada de rvore 'inria re!leta# +ma representao ele(ante para rvores 'inrias repletas o'tida a partir da numerao seq1encial dos ns, comeando com o n do nvel !, depois os ns do nvel ", e assim por diante# &s ns em um nvel so numerados da esquerda para a direita# =ste esquema de numerao serve para definir uma rvore 'inria com!leta# +ma rvore 'inria com n ns e profundidade k completa se e somente se seus ns correspondem aos ns que so numerados de ! at n numa rvore 'inria repleta de profundidade k4# +ma rvore 'inria repleta, de profundidade 6, com numerao seq1encial apresentada a se(uir# 1

9 10

11

12

13 14

15

(ora, considere as se(uintes rvores 'inrias:


4

,o confunda rvore 'inria repleta com rvore 'inria completa# l(uns autores consideram a definio de rvore completa como sendo a vista aqui para rvore repleta, mas aqui fa*/se uma clara distino entre estes dois tipos# ,ote que toda rvore repleta uma rvore completa, mas a recproca no verdadeira#

C D D H I primeira uma rvore 'inria inclinada $) E F G

=stas duas rvores so dois tipos especiais de rvores 'inrias# esquerda%, enquanto que a se(unda uma rvore 'inria com!leta#

&s ns de uma rvore 'inria completa podem ser arma*enados num arranjo unidimensional #"v$"e, com o n numerado por i sendo arma*enado em #"v$"e%i&# 7roposio 4, a se(uir, permite que se determinem as locali*a3es do pai, do filho da esquerda e do filho da direita de um n de uma rvore 'inria completa representada neste esquema# $ prova desta proposio dei-ada como e-erccio#% $ro!osi% o -: ;e uma rvore 'inria completa com n ns representada seq1encialmente como descrito acima, ento, para qualquer n numerado por i, 1 ' i ' n, tem/se: $i% (#i(i) numerado por i B ", se i C !# ;e i = 1, trata/se da rai*, que no possui pai# $ii% Fil)$E*+,e"-#(i) numerado por 2i, se 2i ' n# ;e 2i .n, ento o n i no possui filho da esquerda# $iii% Fil)$Di"ei/#(i) numerado por 2i + 1, se 2i + 1 ' n# ;e 2i + 1 . n, ento o n i no possui filho da direita# representao seq1encial proposta pode ser utili*ada para qualquer rvore 'inria $e no apenas para rvores 'inrias completas%, em'ora, em muitos casos, possa haver desperdcio de espao# 7ara rvores 'inrias completas esta representao ideal, pois no h desperdcio de espao# & pior caso o de uma rvore 'inria inclinada ) direita de profundidade k, que requer 2k - 1 posi3es no arranjo e ocupa efetivamente apenas k posi3es# se(uir, so apresentadas as representa3es por arranjo da rvore inclinada ) esquerda e da rvore completa vistas anteriormente# arvore[ ! A 1 2 B 3 4 C 5 6 7 E 8 9 """ 16 A B C D """ E

arvore[ ! A 1 2 B C 3 4 D E F G 5 6 7 H I 8 9 A B C D E F G H I

lm da desvanta(em de possvel desperdcio de memria, a representao seq1encial tam'm dificulta as opera3es de remoo e insero de ns# De fato, insero e remoo de ns do meio de uma rvore requer o movimento de muitos ns para refletir a mudana de nvel destes ns# =stes pro'lemas podem ser superados com a utili*ao de uma representao encadeada# ,esta representao, cada n seria representado por um re(istro com tr.s campos: e*+,e"-#, -#-$ e -i"ei/#, como ilustrado a se(uir# e#$%er&a &a&o & re 'a

=m'ora, com esta estrutura de ns, torne/se difcil determinar o pai de um n, ela adequada para a maioria das aplica3es de rvores 'inrias# 7ode/se acrescentar um quarto campo, denominado 0#i, se for rotineira a determinao dos pais dos ns#

1.- Caminhamento em rvores Binrias


=ntende/se por caminhamento a ao de percorrer $ visitar% todos os ns de uma rvore com o o'jetivo de e-ecutar al(uma operao so're as informa3es contidas nestes ns $por e-emplo, imprimir, consultar, alterar, etc#%# ,uma lista encadeada, e-iste uma ordem natural para percorrerem/se todos os seus ns, que partir do incio da lista e se(uir na direo do encadeamento at o final da lista $por este motivo, as listas encadeadas so denominadas estruturas lineares%# ,o entanto, no h nenhuma ordem linear natural para se visitarem os ns de uma rvore $as rvores so conhecidas como estruturas n o-lineares%# 7odem/se definir vrias ordens de caminhamento em rvores 'inrias# qui, descrever/se/o os tr.s tipos de caminhamento mais comuns2 so eles: caminhamento em ordem !refi+a $a'reviadamente, !r.-ordem%, caminhamento em ordem infi+a $in-ordem% e caminhamento em ordem sufi+a $!s-ordem%# =m cada um destes mtodos de caminhamento, nada precisa ser feito para caminhar so're uma rvore 'inria va*ia# &s mtodos sero definidos recursivamente, de forma que e-ecutar o caminhamento so're uma rvore 'inria envolve visitar a rai*, e caminhar em suas su'/rvores esquerda e direita# =stes mtodos so descritos em se(uida# a% :aminhamento em 7r/ordem: !# 0isite a rai* "# :aminhe na su'/rvore esquerda em pr/ordem 4# :aminhe na su'/rvore direita em pr/ordem '% :aminhamento em 8n/ordem:

!# :aminhe na su'/rvore esquerda em in/ordem "# 0isite a rai* 4# :aminhe na su'/rvore direita em in/ordem c% :aminhamento em 7s/ordem: !# :aminhe na su'/rvore esquerda em ps/ordem2 "# :aminhe na su'/rvore direita em ps/ordem2 4# 0isite a rai*# :onsidere a se(uinte rvore 'inria: A

&s caminhamentos em pr/ordem, in/ordem e ps/ordem aplicados ) esta rvore 'inria produ*iriam as se(uintes seq1.ncias de visitao dos ns: 7r/ordem: ABDGCEHIF 8n/ordem : DGBAHEICF 7s/ordem: GDBHIEFCA

Ervores 'inrias podem ser utili*adas para representar e-press3es aritmticas# ,este mtodo de representao, a rai* da rvore contm o operador que deve ser aplicado aos resultados das avalia3es das e-press3es aritmticas representadas pelas su'/rvores esquerda e direita# +m n que representa um operador $'inrio% possui duas su'/rvores no/va*ias, enquanto que um n que representa um operando no possui su'/rvores $i#e#, um n/ folha%# ssim, a e-presso A + B1C seria representada pela rvore: (

=nquanto que a e-presso (A + B)1C seria representada como: )

& que acontece quando se e-ecuta so're estas rvores cada uma das tr.s formas de caminhamento definidas acimaF & caminhamento em pr/ordem para a rvore do primeiro e-emplo acima produ* +A1BC, enquanto que, para a rvore do se(undo e-emplo, resultaria em 1+ABC# &'serve que estas seq1.ncias representam justamente as formas prefi-as das e-press3es dadas# ,a realidade, esta re(ra (eral para e-press3es representadas em forma de rvores 'inrias e su(ere a denominao dada a este tipo de caminhamento# G fcil verificar que as

seq1.ncias de ns o'tidas com os caminhamentos em ps/ordem resultam nas formas sufi-as das e-press3es representadas# 7ara as rvores dos e-emplos acima, estes caminhamentos produ*iriam as seq1.ncias: ABC1+ e AB+C1, respectivamente para a primeira e para a se(unda rvore# ;er, ento, que o caminhamento em in/ ordem numa rvore que representa uma e-presso produ* a forma infi-a da e-pressoF resposta nem sem!reI ;e, so're a rvore do primeiro e-emplo, fosse e-ecutado o caminhamento em in/ordem o'ter/se/ia a seq1.ncia A+B1C, que, de fato, a forma infi-a da e-presso representada# =ntretanto, uma rvore 'inria que representa uma e-presso no contm par.nteses, uma ve* que a ordem das opera3es implcita na estrutura da rvore# ssim, uma e-presso cuja forma infi-a necessita de par.nteses para indicar e-plicitamente a ordem das opera3es no pode ter sua forma infi-a recuperada por um caminhamento in/ordem convencional# & caminhamento in/ordem da rvore do se(undo e-emplo acima resultaria em A+B1C, que no corresponde ) forma infi-a da e-presso ori(inal#

1./ Im!lementa% o de rvores Binrias em C


;ero apresentados al(umas fun3es em : para construo de rvores 'inrias e para caminhamentos so're as mesmas# ;ero utili*ados ponteiros e re(istros para a implementao de rvores, pois esta a forma mais ele(ante e prtica de representarem/se rvores em lin(ua(ens que permitem estas facilidades# ,o entanto, oportuno frisar que este no o 5nico modo de representao para rvores $da mesma forma que listas encadeadas no precisam, necessariamente, ser implementadas com ponteiros e re(istros%# s fun3es apresentadas a se(uir se(uintes assumem as declara3es:
'*+e&e,--#'r%.' n$ 2 #'r%.' n$ /D#-$ #'r%.' n$ 4 /5$, 1/A"v$"e3 1e*+,e"-#3 -#-$3 1-i"ei/#3

qui, /D#-$ um tipo de dados qualquer predefinido ou definido anteriormente pelo pro(ramador# funo se(uinte implementa a operao de construo de uma rvore 'inria $mais precisamente, de sua rai*%#
61111 1 1 C$n*/"$iA"v$"e() 1 1 C$n*/",78$ -# "#i9 -e ,:# ;"v$"e <in;"i#= 1 11116 /A"v$"e C$n*/"$iA"v$"e(/D#-$ i/e:) 2 /A"v$"e #"v$"e3 #"v$"e = :#ll$>(*i9e$?(/5$))3 #"v$"e-.-#-$ = i/e:3 #"v$"e-.e*+,e"-# = 5@LL3 #"v$"e-.-i"ei/# = 5@LL3 4 "e/,"n #"v$"e3

s fun3es Fil)$E*+,e"-#() e Fil)$Di"ei/#(), a se(uir, criam, respectivamente, os filhos da esquerda e da direita para um n fornecido#
61111 1 1 Fil)$E*+,e"-#() 1 1 C"i# $ ?il)$ -# e*+,e"-# 0#"# $ nA #0$n/#-$ 0$" 0 >$: $ >$n/eB-$ i/e:= 1 11116 v$i- Fil)$E*+,e"-#(/A"v$"e 0, /D#-$ i/e:) 2 ACCEG@DA(0, EE""$F In*e">#$ inv#li-#=E)3 ACCEG@DA(G0-.e*+,e"-#, EE""$F In*e">#$ inv#li-#=E)3 4 0-.e*+,e"-# = C$n*/"$iA"v$"e(i/e:)3

L 61111 1 1 Fil)$Di"ei/#() 1 1 C"i# $ ?il)$ -# -i"ei/# 0#"# $ nA #0$n/#-$ 0$" 0 >$: $ >$n/eB-$ i/e:= 1 11116 v$i- Fil)$Di"ei/#(/A"v$"e 0, /D#-$ i/e:) 2 ACCEG@DA(0, EE""$F In*e">#$ inv#li-#=E)3 ACCEG@DA(G0-.-i"ei/#, EE""$F In*e">#$ inv#li-#=E)3 0-.-i"ei/# = C$n*/"$iA"v$"e(i/e:)3 4

,as fun3es se(uintes, so implementados $recursivamente% os caminhamentos em pr/ordem, in/ordem e ps/ ordem# & parKmetro $0 utili*ado nestes fun3es um ponteiro para funo definido como:
'*+e&e, vo & (1/H0e"#>#$) (/D#-$)3

7onteiros deste tipo representam operao a serem efetuadas so're a informao $do tipo /D#-$% contida em cada n da rvore# 7or e-emplo, se a informao contida em cada n fosse do tipo char 0 e a operao requerida no caminhamento fosse simplesmente imprimir as informa3es poder/se/ia utili*ar a funo 0,/*() como respectivo parKmetro real numa chamada a qualquer dessas fun3es#
61111 1 1 ("eH"-e:() 1 1 C#:in)#:en/$ e: 0"I-$"-e: n# #"v$"e >,J# "#i9 I #0$n/#-# 0$" #"v$"e3 1 $0 I # $0e"#78$ # *e" e?e/,#-# *$<"e # in?$":#78$ >$n/i-# e: >#-# nA 1 11116 v$i- ("eH"-e:(/A"v$"e #"v$"e, /H0e"#>#$ $0) 2 i? (#"v$"e) 2 $0(#"v$"e-.-#-$)3 61 Ki*i/# # "#i9 16 ("eH"-e:(#"v$"e-.e*+,e"-#,$0)3 61 C#:in)# n# *,<-;"v$"e -# e*+,e"-# 16 ("eH"-e:(#"v$"e-.-i"ei/#,$0)3 61 C#:in)# n# *,<-;"v$"e -# -i"ei/# 16 4 4 61111 1 1 InH"-e:() 1 1 C#:in)#:en/$ e: in-$"-e: n# #"v$"e >,J# "#i9 I #0$n/#-# 0$" #"v$"e3 1 $0 I # $0e"#78$ # *e" e?e/,#-# *$<"e # in?$":#78$ >$n/i-# e: >#-# nA 1 11116 v$i- InH"-e:(/A"v$"e #"v$"e, /H0e"#>#$ $0) 2 i? (#"v$"e) 2 InH"-e:(#"v$"e-.e*+,e"-#,$0)3 61 C#:in)# *,<-;"v$"e e*+,e"-# 16 $0(#"v$"e-.-#-$)3 61 Ki*i/# # "#i9 16 InH"-e:(#"v$"e-.-i"ei/#,$0)3 61 C#:in)# *,<-;"v$"e -i"ei/# 16 4 4 61111 1 1 ($*H"-e:() 1 1 C#:in)#:en/$ e: 0A*-$"-e: n# #"v$"e >,J# "#i9 I #0$n/#-# 0$" #"v$"e3 1 $0 I # $0e"#78$ # *e" e?e/,#-# *$<"e # in?$":#78$ >$n/i-# e: >#-# nA 1 11116 v$i- ($*H"-e:(/A"v$"e #"v$"e, /H0e"#>#$ $0) 2 i? (#"v$"e) 2 ($*H"-e:(#"v$"e-.e*+,e"-#,$0)3 61 C#:in)# n# *,<-;"v$"e e*+,e"-# 16 ($*H"-e:(#"v$"e-.-i"ei/#,$0)3 61 C#:in)# n# *,<-;"v$"e -i"ei/# 16 $0(#"v$"e-.-#-$)3 61 Ki*i/# "#i9 16

N 4 4

1.1 rvores Binrias Costuradas


7odem/se construir fun3es no/recursivas mais eficientes para os caminhamentos vistos anteriormente# 7or e-emplo, uma funo no/recursiva para e-ecutar o caminhamento em in/ordem numa rvore 'inria pode ser escrito como em se(uida# $,esta funo sup3e/se a e-ist.ncia do tipo /(il)#, e das fun3es E:0il)#, De*e:0il)#, C"i#(il)# e (il)#K#9i# que implementam uma pilha cujos elementos so do tipo /A"v$"e#%
61111 1 1 InH"-e:2() 1 1 C#:in)#:en/$ e: in-$"-e: n# #"v$"e >,J# "#i9 I #0$n/#-# 0$" #"v$"e3 1 $0 I # $0e"#78$ # *e" e?e/,#-# *$<"e # in?$":#78$ >$n/i-# e: >#-# nA= 1 E*/# i:0le:en/#78$ 0"$-,9 $ :e*:$ "e*,l/#-$ +,e # ve"*8$ #n/e"i$", :#*, 1 -i?e"en/e:en/e -# ve"*8$ #n/e"i$", e*/# ve"*8$ I n8$-"e>,"*iv#= 1 11116 v$i- InH"-e:2(/A"v$"e #"v$"e, /H0e"#>#$ $0) 2 /(il)# 0il)#3 /A"v$"e 0A"v$"e3 C"i#(il)#(L0il)#)3 0A"v$"e = #"v$"e3 -$ 2 M)ile (0A"v$"e) 2 E:0il)#(0A"v$"e, L0il)#)3 0A"v$"e = 0A"v$"e-.e*+,e"-#3 4 i? (G(il)#K#9i#(0il)#)) 2 0A"v$"e = De*e:0il)#(L0il)#)3 $0(0A"v$"e-.-#-$)3 0A"v$"e = 0A"v$"e-.-i"ei/#3 4 4 M)ile (G(il)#K#9i#(0il)#) NN 0A"v$"e)3 4

=-iste uma maneira ainda mais eficiente do que a precedente para implementar/se o caminhamento em in/ ordem# =-aminando/se a funo anterior, perce'e/se que a pilha desempilhada quando 0A"v$"e i(ual a 5@LL# 8sto pode acontecer em duas situa3es# +ma situao aquela em que se sai da instruo M)ile aps esta ter sido e-ecutado uma ou mais ve*es# 8sto si(nifica que se caminhou para 'ai-o e ) esquerda at que se atin(iu um ponteiro 5@LL, empilhando/se cada n ) medida em que se passava por ele# ssim, o elemento do topo da pilha valor de 0A"v$"e antes de ele tornar/se 5@LL# ;e um ponteiro au-iliar + for mantido um passo antes de 0A"v$"e, o valor de + pode ser utili*ado diretamente e no precisa ser empilhado# outra situao na qual 0A"v$"e 5@LL quando a instruo M)ile no e-ecutada# 8sto ocorre aps ser atin(ido um n com uma su'/rvore direita va*ia2 i#e#, aps e-ecutar/se a instruo 0A"v$"e < 0A"v$"e-.-i"ei/# e retornar/se ao incio do lao -$-M)ile# ,este ponto, ter/se/ia perdido a ordem de caminhamento se no fosse o fato de o n, em cuja su'/rvore esquerda foi feito o caminhamento justamente anterior, estar no topo da pilha# ;uponha, ento, que ao invs de um ponteiro i(ual a 5@LL, um n com su'/rvore direita va*ia possusse um ponteiro para o n que deveria estar no topo da pilha neste ponto da funo# =nto no haveria mais necessidade da pilha, pois o n apontaria diretamente para seu sucessor no caminhamento em in/ordem# Mal ponteiro denominado de uma costura e deve ser diferenciado de um ponteiro normal da rvore, utili*ado para li(ar um n )s suas su'/rvores esquerda e direita# fi(ura a se(uir mostra uma rvore com costuras $linhas pontilhadas%, conforme aqui descrito# &'serve que o n mais ) direita na fi(ura tem seu ponteiro direito i(ual a 5@LL, uma ve* que ele no possui nenhum sucessor em in/ordem# Ervores com costuras conforme descritas aqui so denominada de rvores costuradas em in-ordem 2 direita # +ma rvore 'inria costurada em inordem 2 es,uerda tam'm pode ser similarmente definida como sendo aquela na qual cada ponteiro esquerdo i(ual a 5@LL alterado para conter uma costura para seu antecessor no caminhamento in/ordem# 7ode/se ainda ter uma rvore 'inria que seja simultaneamente costurada em in/ordem ) esquerda e ) direita# ,este 5ltimo A caso, di*/se que a rvore costurada em in-ordem # s rvores costuradas em in/ordem ) esquerda no resultam em tantas vanta(ens quanto as costuradas ) direita e, portanto, no sero consideradas aqui# B C

!0

7ara a implementao de rvores 'inrias costuradas in/ordem ) direita e para as fun3es se(uintes, so supostas as se(uintes declara3es:
'*+e&e, e/%0 2CIM, 5AH4 /C$*/,"#3 '*+e&e,--#'r%.' n$ 2 #'r%.' n$ /D#-$ #'r%.' n$ /C$*/,"# 4 /5$, 1/A"v$"e3 1e*+,e"-#3 -#-$3 1-i"ei/#3 >$*/,"#3

funo C$n*/"$iA"v$"e() vista anteriormente para rvores 'inrias no/costuradas permanece imutvel para o caso de rvores costuradas# s fun3es Fil)$E*+,e"-#() e Fil)$Di"ei/#() so modificadas, conforme mostrado em se(uida#
61111 1 1 Fil)$E*+,e"-#() 1 1 C"i# $ ?il)$ -# e*+,e"-# 0#"# $ nA #0$n/#-$ 0$" 0 -e ,:# #"v$"e <in;"i# 1 >$*/,"#-# e: in-$"-e: >$: $ >$n/eB-$ i/e:= 1 11116 v$i- Fil)$E*+,e"-#(/A"v$"e 0, /D#-$ i/e:) 2 /A"v$"e +3 ACCEG@DA(0, EE""$F In*e">#$ inv#li-#=E)3 ACCEG@DA(G0-.e*+,e"-#, EE""$F In*e">#$ inv#li-#=E)3 + = :#ll$>(*i9e$?(/5$))3 +-.-#-$ = i/e:3 0-.e*+,e"-# = +3 +-.>$*/,"# = CIM3 +-.-i"ei/# = 03 +-.e*+,e"-# = 5@LL3

61111 1 1 Fil)$Di"ei/#() 1 1 C"i# $ ?il)$ -# -i"ei/# 0#"# $ nA #0$n/#-$ 0$" 0 -e ,:# #"v$"e <in;"i# 1 >$*/,"#-# e: in-$"-e: >$: $ >$n/eB-$ i/e:= 1 11116 v$i- Fil)$Di"ei/#(/A"v$"e 0, /D#-$ i/e:) 2 /A"v$"e +, "3 ACCEG@DA(0, EE""$F In*e">#$ inv#li-#=E)3 ACCEG@DA(G0-.-i"ei/# NN 0-.>$*/,"# == CIM, EE""$F In*e">#$ inv#li-#=E)3 + = :#ll$>(*i9e$?(/5$))3 +-.-#-$ = i/e:3 " = 0-.-i"ei/#3 61 O,#"-# $ *,>e**$" in-$"-e: -e 0 16 0-.-i"ei/# = +3 0-.>$*/,"# = 5AH3 +-.e*+,e"-# = 5@LL3 i? (G")

!! +-.>$*/,"# = 5AH3 el*e +-.>$*/,"# = CIM3 4 +-.-i"ei/# = "3

funo InH"-e:() a se(uir implementa o caminhamento em in/ordem para uma rvore costurada in/ordem ) direita#
61111 1 1 InH"-e:() 1 1 C#:in)#:en/$ e: in-$"-e: n# #"v$"e <in;"i# >$*/,"#-# in-$"-e: P -i"ei/#, 1 >,J# "#i9 I #0$n/#-# 0$" #"v$"e= 1 $0 I # $0e"#78$ # *e" e?e/,#-# *$<"e # in?$":#78$ >$n/i-# e: >#-# nA= 1 11116 v$i- InH"-e:(/A"v$"e #"v$"e, /H0e"#>#$ $0) 2 /A"v$"e 0,+3 0 = #"v$"e3 -$ 2 + = 5@LL3 M)ile (0) 2 + = 03 0 = 0-.e*+,e"-#3 4 i? (+) 2 $0(+-.-#-$)3 0 = +-.-i"ei/#3 M)ile (+-.>$*/,"# == CIM) 2 $0(0-.-#-$)3 + = 03 0 = +-.-i"ei/#3 4 4 4 M)ile (+)3 4

;e as implementa3es das fun3es ("eH"-e:() e ($*H"-e:() forem desejadas para o tipo de rvore costurada implementada aqui, deve/se tomar o cuidado de no se(uir as costuras como se estas fossem ramifica3es normais# 8sto , deve/se colocar as instru3es:
("eH"-e:(#"v$"e-.-i"ei/#,$0)3

e
($*H"-e:(#"v$"e-.-i"ei/#,$0)3

das fun3es ("eH"-e:() e ($*H"-e:() apresentadas anteriormente no corpo da instruo if:


i? (#"v$"e-.>$*/,"# == 5AH)

Oinalmente, podem ainda ser definidos outros tipos de costuras para os caminhamentos pr/ordem e ps/ordem# 7ara estudo mais aprofundado so're este assunto, aconselha/se consultar a 'i'lio(rafia#

1.3 4e!resenta% o de rvores !or rvores Binrias


0er/se/ nesta seo que toda rvore pode ser representada como uma rvore 'inria# =ste fato tem implica3es importantes para a implementao de rvores# De fato, a implementao de rvores, cujos ns podem ter seus (raus variando muito de um n para outro, feita utili*ando/se ns $re(istros% de tamanhos variveis ou utili*ando/se ns de tamanhos fi-os que cont.m um n5mero de campos de ponteiros i(ual ao (rau da rvore $i#e#, i(ual ao maior (rau dentre todos os ns da rvore%# =sta 5ltima forma de implementao dos ns de uma rvore (era um desperdcio muito (rande de memria, conforme v./se em se(uida#

!"

;uponha uma rvore de (rau k com n ns de tamanho fi-o, como o n da fi(ura a'ai-o: Da&o F 12o-1 F 12o-2 """ F 12o-3

+ma ve* que cada ponteiro no/nulo aponta para um n e e-atamente um ponteiro aponta para cada um dos ns $e-ceto para a rai*%, o n5mero de li(a3es no/nulas numa rvore de n ns e-atamente n - 1# & n5mero total de campos de ponteiros numa rvore de (rau k nk# ssim, o n5mero de ponteiros nulos numa tal rvore dado por:
nk - (n - 1) = n(k - 1) + 1

+ma conseq1.ncia disso que uma rvore de (rau 4, por e-emplo, possui mais de "B4 $ 26Q + 16Qn, e-atamente% de seus campos de li(a3es nulos# proporo de li(a3es nulas apro-ima/se de ! quando o (rau da rvore cresce $demonstre isto%# vanta(em de representarem/se rvores por rvores 'inrias que, nestas 5ltimas, apenas cerca de metade das li(a3es so nulas# :onsidere a rvore da fi(ura a se(uir:

,uma rvore qualquer, cada n tem no m-imo um filho na e-trema esquerda e no m-imo um irmo mais pr-imo ) direita# ,a rvore da fi(ura acima, o filho mais ) esquerda do n B E e seu irmo mais pr-imo ) direita o n C# ,o mtodo de transformao a ser utili*ado, cada n da rvore 'inria ter como filho ) esquerda o filho mais ) esquerda do n correspondente na rvore sendo representada, e como filho ) direita o irmo mais pr-imo ) direita do n correspondente na rvore ori(inal# +ma ve* que, numa rvore no/ordenada, a ordem dos filhos no importante, qualquer dos filhos de um n poderia ser seu filho mais ) esquerda e qualquer de seus irmos poderia ser seu irmo mais pr-imo ) direita# penas por uma questo de sistemati*ao, os ns so escolhidos da forma em que eles so desenhados na rvore# +ma forma prtica e totalmente equivalente ao que foi descrito acima de o'ter/se a representao de uma rvore por rvore 'inria unir todos os irmos de um n e apa(ar todos os ponteiros de um n para seus filhos, e-ceto aquele que o une a seu filho mais ) esquerda# +tili*ando este artifcio para a rvore da fi(ura anterior o'tm/se a se(uinte rvore 'inria: A

A C

B F

fi(ura o'tida pode no parecer muito com uma rvore 'inria, mas se os ramos hori*ontais da fi(ura forem (irados no sentido horrio o'tm/se: E C

!4

&utros e-emplos de transformao so vistos em se(uida: rvore A rvore Binria A

B A

B A

C ,ote que as ra*es das rvores 'inrias resultantes no possuem filhos ) direita# 8sto deve/se ao fato de a rai* da rvore transformada no possuir nenhum irmo# =ste fato pode ser utili*ado para transformarem/se florestas numa 5nica rvore 'inria# 7ara isto, transforma/se inicialmente cada rvore da floresta em rvore 'inria e, depois, une/se estas rvores 'inrias por meio dos ponteiros direitos dos ns/ra*es# +tili*ando/se este mtodo, a floresta: A E G

B resulta na rvore 'inria:

!6

1.5. 6!lica%7es de rvores


Dentre as in5meras aplica3es de rvores, apenas duas sero vistas aqui: aplica3es de rvores $!% em tomadas de deciso e $"% em jo(os#

1.5.1 rvores de 8ecis o


+ma aplicao prtica de rvores no processo de tomada de decis o# :omo ilustrao desse processo, considere o pro'lema conhecido como pro'lema das oito moedas# Dadas as moedas #, <, >, -, e, ?, O, e ), sa'e/se que uma delas falsa e tem um peso diferente das demais# & o'jetivo determinar qual das moedas falsa, utili*ando uma 'alana de 'raos i(uais# Deseja/se fa*er isto utili*ando/se o menor n5mero de compara3es e, ao mesmo tempo, determinar se a moeda falsa mais pesada ou mais leve que as demais# rvore da fi(ura a se(uir representa um conjunto de decis3es pelas quais pode/se o'ter a resposta do pro'lema# 7or isso, tal rvore denominada de rvore de decis o# utili*ao de letras mai5sculas ( ou L si(nifica que a moeda falsa mais pesada ou mais leve que as demais#
# + < + > T - + e + ?

# + - T < + e

O T )

# + - T < + e

.
# T <

=
> T #

R
< T #
O T #

R
) T # # T <

=
# T >

R
< T #

.
#F(

=
eFL

.
>F(

=
?FL

.
<F(

=
-FL

.
OF(

=
)FL

.
)F(

=
OFL

.
<FL

=
-F(

.
>FL

=
?F(

.
#FL

=
eF(

&'serve que se # + < + > R - + e + ? , ento sa'e/se que a moeda falsa est presente entre estas seis moedas e no O nem )# ;uponha que, na pr-ima medida, encontra/se que # + - R < + e, e, depois, trocando/se < por -, no se o'tm nenhuma mudana na desi(ualdade# 8sto si(nifica duas coisas: $!% que nem > nem ? falsa e $"% que nem < nem - falsa# ;e # + - fosse i(ual a < + e, ento ou > ou ? seria a moeda falsa# ;a'endo neste ponto que # ou e a moeda falsa, compara/se # com uma moeda 'oa $por e-emplo, <%# ;e # = <, ento e mais pesada2 caso contrrio, # deve ser mais leve que as demais moedas# &'servando/se atentamente esta rvore da 5ltima fi(ura, v./se que todas as possi'ilidades so co'ertas, uma ve* que h L moedas que podem ser mais leves ou mais pesadas, e h !H ns terminais# :ada caminho requer e-atamente 4 compara3es# 0isuali*ar este pro'lema como uma rvore de deciso muito 5til, mas esta rvore no fornece imediatamente um al(oritmo# 7ara resolver o pro'lema das oito moedas com um pro(rama, deve/se escrever uma srie de testes que espelhem a estrutura da rvore# & pro(rama em : a se(uir reflete a soluo do pro'lema das oito moedas de acordo com a rvore de deciso apresentada aqui# funo C$:0#"e() utili*ada para e-ecutar a 5ltima comparao da srie#
S /.1%&e R*/-i$=). '*+e&e, e/%0 2A, B, C, D, E, F, G, H4 /M$e-#3 61111 1 1 C$:0#"#() 1 1 C$:0#"# >$: # :$e-# 0#-"8$ 9 e i:0"i:e $ "e*,l/#-$ -# >$:0#"#78$= 1 11116

!D vo & C$:0#"#(/M$e-# , /M$e-# U, /M$e-# 9, %/# 4/e& 10) 2 , (0% & . 0%9&) 0"in/?(EVnA :$e-# W> eX :#i* 0e*#-#=E, XAX + )3 e1#e 0"in/?(EVnA :$e-# W> eX :#i* leve=E, XAX + U)3 4 2 /' :#in(vo &) %/# 4/e& 0e*$*%Y&3 /M$e-# M3 0"in/?(E("$<le:# -#* Hi/$ M$e-#*VnE)3 0"in/?(E======== === ==== ======VnVnE)3 ,or (M = A3 M R= H3 ++M) 2 0"in/?(EVn(e*$ -# :$e-# W>F E, XAX + M)3 *>#n?(EW-E, L0e*$*%M&)3 4 , (0e*$*%A& + 0e*$*%B& + 0e*$*%C& == 0e*$*%D& + 0e*$*%E& + 0e*$*%F&) , (0e*$*%G& . 0e*$*%H&) C$:0#"#(G, H, A, 0e*$*)3 e1#e C$:0#"#(H, G, A, 0e*$*)3 e1#e , (0e*$*%A& + 0e*$*%B& + 0e*$*%C& . 0e*$*%D& + 0e*$*%E& + 0e*$*%F&) , (0e*$*%A& + 0e*$*%D& == 0e*$*%B& + 0e*$*%E&) C$:0#"#(C, F, A, 0e*$*)3 e1#e , (0e*$*%A& + 0e*$*%D& . 0e*$*%B& + 0e*$*%E&) C$:0#"#(A, E, B, 0e*$*)3 e1#e C$:0#"#(B, D, A, 0e*$*)3 e1#e , (0e*$*%A& + 0e*$*%B& + 0e*$*%C& R 0e*$*%D& + 0e*$*%E& + 0e*$*%F&) , (0e*$*%A& + 0e*$*%D& == 0e*$*%B& + 0e*$*%E&) C$:0#"#(F, C, A, 0e*$*)3 e1#e i? (0e*$*%A& + 0e*$*%D& . 0e*$*%B& + 0e*$*%E&) C$:0#"#(D, B, A, 0e*$*)3 e1#e C$:0#"#(E, A, B, 0e*$*)3 re'%r/ !3 4

1.5.# rvores de 9ogos


aplicao de rvores a jo(os por computador ser ilustrado aqui apresentando/se um pro(rama em : para determinar a melhor jo(ada no conhecido jogo-da-velha a partir de uma dada situao $riscado% no ta'uleiro# ;uponha que e-ista uma funo, denominada Av#li#(), que rece'e como ar(umentos uma posio do ta'uleiro e uma indicao de um jo(ador $X ou H% e retorna um valor que representa a qualidade da posio para este jo(ador $quanto maior for o valor retornado por Av#li#(), melhor ser a posio%# +ma posio vencedora resulta no maior valor possvel e uma posio perdedora resulta no menor valor possvel# +m e-emplo de tal funo de avaliao para o jo(o/da/velha o n5mero de linhas, colunas e dia(onais que podem ser preenchidas por um jo(ador menos o n5mero destas que podem ser preenchidas por seu oponente# =sta funo no examina adiante para considerar quaisquer possveis posi3es que possam resultar a partir da posio corrente2 i#e#, ela simplesmente avalia uma posio esttica do ta'uleiro# Dada uma posio do ta'uleiro, a pr-ima melhor jo(ada pode ser determinada considerando todos as possveis jo(adas e posi3es resultantes# jo(ada que resulta na situao do ta'uleiro com a maior avaliao dever ser selecionada# =ntretanto, tal anlise no resulta necessariamente na melhor jo(ada, como pode ser visto na fi(ura se(uinte# =sta fi(ura ilustra uma posio e os cinco possveis jo(adas que o jo(ador X pode fa*er a partir desta posio# aplicao da funo de avaliao descrita acima para as cinco posi3es resulta nos valores mostrados na parte inferior da fi(ura# Puatro jo(adas resultam no mesmo valor m-imo $"%, em'ora tr.s destas jo(adas sejam claramente inferiores ) quarta# $ quarta jo(ada resulta numa vitria certa para X, enquanto as outras tr.s podem ser (anhas por H#% De fato, a jo(ada que resulta na menor avaliao to 'oa ou melhor do que as jo(adas que resultam numa avaliao mais alta# 7ortanto, a avaliao esttica su(erida no suficientemente 'oa para prever o resultado do jo(o#

!H

=m'ora uma funo de avaliao possa ser facilmente produ*ida para esse jo(o 6, muitos jo(os $e#(#, -adre*% so to comple-os que praticamente impossvel encontrar fun3es de avaliao estticas que determinem a melhor resposta#

6 5 6

6 5

6 5 5 6 2

6 5 5 2 6

6 5

5 5 6

6 5 6 1

6 2

5 2

;uponha a(ora que seja possvel visuali*ar vrias jo(adas adiante# 0er/se/ que, neste caso, a escolha de uma jo(ada pode ser melhorada consideravelmente# (ora, define/se o n"vel de visualiza% o adiante como o n5mero de futuras jo(adas a serem consideradas $no confunda com o n5mero de possveis situa3es do ta'uleiro%# ssim, comeando em qualquer posio, possvel construir uma rvore das possveis posi3es do ta'uleiro que podem resultar de cada jo(ada# Mal rvore denominada de uma rvore de :ogo# rvore de jo(o para a posio de a'ertura do jo(o da velha com um nvel de visuali*ao adiante i(ual a 4 $ !rofundidade da rvore do jo(o% mostrada na fi(ura a se(uir D#

,o caso do jo(o/da/velha, isto possvel mesmo que seja na fora bruta2 i#e#, listando todas as situa3es e respostas apropriadas# G fcil verificar que, sem levar em considerao a simetria de muitos jo(os, e-istem NI $< 4H"#LL0% jo(os possveis# D ,a realidade, e-istem outras posi3es mas, devido a considera3es de simetria, estas so efetivamente as mesmas que as posi3es apresentadas#
6

!J

& jo(ador que deve jo(ar na posio do jo(o representada na rai* ser desi(nado por @ Q e seu oponente por @8,H# & o'jetivo aqui tentar encontrar a melhor jo(ada para @ Q a partir da rai* da rvore de jo(o# &s ns podem ser desi(nados como ns @ Q ou ns @8,, dependendo de qual jo(ador jo(ar a partir deste n# 7or isso, cada n da 5ltima fi(ura marcado como @ Q ou @8,# ;uponha que as posi3es de todos os filhos de um n @ Q tenham sido avaliadas para o jo(ador @ Q# =nto, claramente, @ Q deve escolher a jo(ada que resulte na maior avaliao# ssim, o valor de um n @ Q para o jo(ador @ Q o maior valor dentre os valores de seus filhos# 7or outro lado, uma ve* que @ Q tenha jo(ado, @8, dever escolher a jo(ada que resulte na avaliao mnima para o jo(ador @ Q# ssim, o valor de um n @8, para o jo(ador @ Q o menor valor apresentado por seus filhos# 7ortanto, para decidir a melhor jo(ada para o jo(ador @ Q a partir da rai*, as posi3es das folhas devem ser avaliadas para o jo(ador @ Q utili*ando uma funo de avaliao esttica# =stes valores so ento movidos para cima, em direo ) rai*, atri'uindo a cada n @ Q o valor m-imo de seus filhos e para cada n @8, o mnimo dos valores de seus ns filhos, supondo que @8, escolher a jo(ada que a pior para @ Q# & valor atri'udo para cada n da 5ltima fi(ura por este processo est indicado imediatamente a'ai-o do n# jo(ada que @ Q deve selecionar, dada a posio do ta'uleiro no n/rai*, aquela que possui o valor m-imo# ssim, a jo(ada de a'ertura para X deve ser o quadrado do meio, como ilustrado na fi(ura anterior# fi(ura a se(uir ilustra a determinao da melhor rplica de H# ,ote que as desi(na3es @ Q e @8, dependem de qual jo(ada est sendo planejada# ssim, na fi(ura anterior, X desi(nado por @ Q, enquanto que, na fi(ura a se(uir, H desi(nado por @ Q# =ste mtodo denominado de m.todo minima+ porque, quando a rvore e-plorada, m-imos e mnimos so aplicados alternadamente em cada nvel da rvore#

melhor jo(ada para um jo(ador a partir de uma dada posio pode ser determinada construindo/se primeiro a rvore do jo(o e aplicando/se, em se(uida, uma funo de avaliao esttica para as folhas J# =stes valores so ento movidos em direo ) rai* da rvore aplicando/se mnimos e m-imos aos ns @ Q e @8,, respectivamente# ,a implementao da rvore de jo(o, cada n da rvore deve incluir uma representao do ta'uleiro e uma forma de indicar se cada n @ Q ou @8,# ssim, o tipo de n da rvore pode ser declarado como:
'*+e&e, e/%0 2KAZIH = X X, H = XHX, X = XXX4 /C$n/e,-$3 '*+e&e, e/%0 2MI5, MAX4 /[i0$De5$3 '*+e&e,--#'r%.' n$ 2 /C$n/e,-$
H J

/#<,lei"$%Q&%Q&3

@ais adiante, voc. entender a ra*o desta denominao# =stas folhas, na realidade, no so ns terminais da rvore de jo(o completa $i#e#, elas no posi3es finais do ta'uleiro%# =stas folhas so ns terminais da rvore de jo(o construda at a profundidade desejada#

!L /[i0$De5$ #'r%.' n$ #'r%.' n$ 4 /5$, 1/A"v$"e3 /i0$De5$3 1?il)$E*+,e"-#3 10"$ i:$I":#$3

& campo /#<,lei"$ representa o prprio ta'uleiro de jo(o e os possveis valores para cada um dos componentes do arranjo so o'viamente KAZIH, H ou X, enquanto que o campo /i0$De5$ representa o tipo de n2 os valores possveis deste campo so, conforme foi convencionado acima, MAX ou MI5# Oinalmente, os campos ?il)$E*+,e"-# e 0"$ i:$I":#$ so ponteiros para o filho mais ) esquerda do n e seu irmo mais pr-imo ) direita, respectivamente# funo Mel)$"J$O#-#(), apresentada a se(uir, estima a melhor jo(ada a ser feita a se(uir#

61111 1 1 Mel)$"J$O#-#()F E*/i:# # :el)$" J$O#-# # *e" ?ei/# # *eO,i" 1 1 A"O,:en/$*F /#< (en/"#-#) - /#<,lei"$ +,e "e0"e*en/# # "#i9 -# ;"v$"e -e J$O$ 1 #/,#l 1 0"$?,n-i-#-e (en/"#-#) \ # 0"$?,n-i-#-e -# ;"v$"e -e J$O$ 1 J$O#-$" (en/"#-#) \ $ J$O#-$" -# ve9 1 n$v$[#< (*#-#) - /#<,lei"$ $"iOin#l #l/e"#-$ 0#"# >$n/e" # :el)$" 1 J$O#-# 1 11116 vo & Mel)$"J$O#-#( /C$n/e,-$ /#<%&%Q&, %/# 4/e& 0"$?,n-i-#-e, /C$n/e,-$ J$O#-$", /C$n/e,-$ n$v$[#<%&%Q& ) 2 /A"v$"e #"v$"e, :el)$"L#n>e3 %/# 4/e& i, J3 /' v#l$"3 61 C$n*/"Ai # ;"v$"e -$ J$O$ >$: # 0"$?,n-i-#-e 16 61 -#-# /en-$ /#< >$:$ >$n/eB-$ -# "#i9= 16 #"v$"e = C$n*/"$iA"v$"e(/#<, 0"$?,n-i-#-e)3 61 ("$>,"# # :el)$" J$O#-# n# ;"v$"e "e>I: >"i#-#= 61 A v#"i;vel :el)$"L#n>e #0$n/#"; 0#"# $ nA >$""e*0$n-en/e 61 #$ :el)$" l#n>e e # v#"i;vel v#l$" >$n/e"; $ v#l$" -# J$O#-#= ("$>,"#Mel)$"L#n>e(#"v$"e, J$O#-$", L:el)$"L#n>e, Lv#l$")3 ,or (i = !3 i R Q3 ++i) ,or (J = !3 J R Q3 ++J) n$v$[#<%i&%J& = :el)$"L#n>e-./#<,lei"$%i&%J&3 61 A ;"v$"e n8$ I :#i* ne>e**;"i# ne*/e 0$n/$= ($"/#n/$, 16 61 I ne>e**;"i$ li<e"#" $ e*0#7$ $>,0#-$ 0el# :e*:# 0#"# 16 61 evi/#" -e*0e"->i$ -e :e:A"i#= 16 De*/"$iA"v$"e(#"v$"e)3 16 16 16

funo Mel)$"J$O#-#(), apresentada acima, utili*a a funo De*/"$iA"v$"e() que li'era o espao ocupado pela rvore de jo(o quando no mais precisa dela# implementao desta funo dei-ada como e-erccio# funo C$n*/"$iA"v$"e(), apresentada a se(uir, retorna um ponteiro para uma rvore de jo(o que tem na rai* o ta'uleiro passado como ar(umento# =sta funo tam'm rece'e a profundidade da rvore como ar(umento#
61111 1 1 C$n*/"$iA"v$"e()F De/$"n# ,: 0$n/ei"$ 0#"# ,:# ;"v$"e -e J$O$ 1 1 A"O,:en/$*F /#< (en/"#-#) - /#<,lei"$ +,e "e0"e*en/# # "#i9 -# ;"v$"e 1 0"$?,n-i-#-e (en/"#-#) \ # 0"$?,n-i-#-e -# ;"v$"e 1 1 De/$"n$F 0$n/ei"$ 0#"# # "#i9 -# ;"v$"e >"i#-# 1 11116 /A"v$"e C$n*/"$iA"v$"e(/C$n/e,-$ /#<%&%Q&, %/# 4/e& 0"$?,n-i-#-e) 2

!N /A"v$"e #"v$"e3 %/# 4/e& i, J3 #"v$"e = :#ll$>(# 7eo,(/5$))3 61 C"i# # "#i9 16 61 A/,#li9# >$n/eB-$ -$ /#<,lei"$ -# "#i9 16 ,or (i = !3 i R Q3 ++i) ,or (J = !3 J R Q3 ++J) #"v$"e-./#<,lei"$%i&%J& = /#<%i&%J&3 #"v$"e-./i0$De5$ = MAX3 61 A "#i9 I ,: nA MAX 16 #"v$"e-.?il)$E*+,e"-# = 5@LL3 61 A "#i9 #in-# n8$ /e: nen),: ?il)$ 16 #"v$"e-.0"$ i:$I":#$ = 5@LL3 61 A "#i9 n8$ /e: i":8$* 16 E 0#n-e(#"v$"e, 1, 0"$?,n-i-#-e)3 61 E 0#n-e # "#i9 -# ;"v$"e (nvel = 1) 16 4 re'%r/ #"v$"e3

funo E 0#n-e(), apresentada a se(uir, e-pande o n rece'ido como ar(umento no nvel dado at a profundidade desejada#
61111 1 1 E 0#n-e()F E 0#n-e ,: nA -# ;"v$"e -e J$O$, Oe"#n-$ /$-#* #* 0$*i7]e* 1 +,e 0$-e: *e" $</i-#* # 0#"/i" -$ /#<,lei"$ -$ nA "e>e<i-$ 1 >$:$ #"O,:en/$= H* nA* Oe"#-$* /$"n#:-*e ?il)$* -$ nA 1 "e>e<i-$ >$:$ #"O,:en/$= En/8$, e*/# ?,n78$ I >)#:#-# 1 "e>,"*iv#:en/e ,*#n-$ $* nA* Oe"#-$* >$:$ #"O,:en/$* #/I 1 +,e # 0"$?,n-i-#-e -e*eJ#-# *eJ# #/inOi-#= 1 1 A"O,:en/$*F 0 (en/"#-#6*#-#) - 0$n/ei"$ 0#"# $ nA # *e" e 0#n-i-$ 1 nivel (en/"#-#) \ nvel -$ nA 1 0"$?,n-i-#-e (en/"#-#) \ 0"$?,n-i-#-e -# e 0#n*8$ 1 11116 vo & E 0#n-e(/A"v$"e 0, %/# 4/e& nivel, %/# 4/e& 0"$?,n-i-#-e) 2 /A"v$"e ?il)$*3 , (nivel R= 0"$?,n-i-#-e) 2 61 58$ e 0#n-e # ;"v$"e #lI: -# 0"$?,n-i-#-e 16 ?il)$* = Ge"#Fil)$*(0-./#<,lei"$)3 61 Ge"# $* ?il)$* -$ nA -#-$ 16 0-.?il)$E*+,e"-# = ?il)$*3 61 H ?il)$ -# e*+,e"-# I $ 0"i:ei"$ -# li*/# 16 61 A/,#li9# $* /i0$* -$* nA* -$* ?il)$* e $* e 0#n-e *e ne>e**;"i$ 16 82 1e (?il)$*) 2 , (0-./i0$De5$ == MAX) 61 Ce $ nA *en-$ e 0#n-i-$ ?$" MAX,=== 16 ?il)$*-./i0$De5$ = MI53 61 === *e,* ?il)$* *e"8$ MI5= 16 e1#e ?il)$*-./i0$De5$ = MAX3 61 C#*$ >$n/";"i$, ele* *e"8$ MAX= 16 61 [#lve9, n8$ )#J# :#i* e 0#n*8$= 5e*/e >#*$, 16 61 $* nA* "e>I: Oe"#-$* *e"8$ ?$l)#*= 16 ?il)$*-.?il)$E*+,e"-# = 5@LL3 61 E 0#n-e $* ?il)$*= H nvel I #>"e*>i-$ -e 1, 16 61 0$i* -e*>e,-*e :#i* ,: nvel n# ;"v$"e 16 E 0#n-e(?il)$*, nivel + 1, 0"$?,n-i-#-e)3 4 4 4 ?il)$* = ?il)$*-.0"$ i:$I":#$3 61 (#**#-*e 0#"# $ 0"A i:$ ?il)$ 16

funo Ge"#Fil)$*(), apresentada a se(uir, rece'e uma posio do ta'uleiro como entrada e retorna um ponteiro para uma lista de ns contendo as posi3es de ta'uleiro que podem ser o'tidas a partir do ta'uleiro rece'ido como ar(umento#
61111 1 1 Ge"#Fil)$*()F De/$"n# ,: 0$n/ei"$ 0#"# ,:# li*/# -e nA* +,e *8$ ?il)$* -$ 1 nA >,J$ /#<,lei"$ I 0#**#-$ >$:$ #"O,:en/$=

"0 1 1 A"O,:en/$*F /#< (en/"#-#) \ /#<,lei"$ -$ +,#l *e"8$ Oe"#-$* $* nA* 1 1 De/$"n$F 0$n/ei"$ 0#"# # li*/# -e nA* Oe"#-$* 1 11116 /A"v$"e Ge"#Fil)$*(/C$n/e,-$ /#<%&%Q&) 2 /A"v$"e li*/#De5$* = 5@LL3 /C$n/e,-$ +,e:J$O#3 %/# 4/e& i, J, nH* = !, nX* = !3 61 ^ 0"e>i*$ -e/e":in#" 0"i:ei"$ -e +,e: I # J$O#-# 16 ,or (i = !3 i R Q3 ++i) ,or (J = !3 J R Q3 ++J) , (/#< %i&%J& == X) nX*++3 e1#e , (/#< %i&%J& == H) nH*++3 61 C$:$ X >$:e7# $ J$O$, $ nB:e"$ -e H* I *e:0"e :en$" $, iO,#l 16 61 #$ nB:e"$ -e X*= _,#n-$ $ nB:e"$ -e H* I :en$" -$ +,e $ nB:e"$ 16 61 -e X*, I # ve9 -e H J$O#"= C#*$ >$n/";"i$, I # ve9 -e X J$O#"= 16 +,e:J$O# = (nH* R nX*) T H F X3 ,or (i = !3 i R Q3 ++i) ,or (J = !3 J R Q3 ++J) , (/#< %i&%J& == KAZIH) li*/#De5$* = A>"e*>en/#5#Li*/#(Lli*/#De5$*, /#<, i, J, +,e:J$O#)3 4 re'%r/ li*/#De5$*3

funo A>"e*>en/#5#Li*/#(), acrescenta um n no incio da lista de ta'uleiros rece'ida como entrada# & conte5do do ta'uleiro dado pelos ar(umentos restantes#
61111 1 1 A>"e*>en/#5#Li*/#()F A>"e*>en/# ,: nA P li*/# -e nA* "e>e<i-# >$:$ #"O,:en/$ 1 e "e/$"n# ,: 0$n/ei"$ 0#"# # li*/# #>"e*>i-# 1 1 A"O,:en/$*F li*/# (en/"#-#6*#-#) \ 0$n/ei"$ 0#"# in>i$ -# li*/# -e nA* 1 /#< (en/"#-#) \ /#<,lei"$ #n/e* -# J$O#-# 1 lin)#, >$l,n# (en/"#-#) \ # lin)# e # >$l,n# $n-e *e"; ?ei/# # 1 J$O#-# 1 J$O#-# (en/"#-#) \ # J$O#-# # *e" ?ei/# (X $, H) 1 1 De/$"n$F 0$n/ei"$ 0#"# # li*/# #>"e*>i-# -$ nA "e*,l/#n/e -# J$O#-# 1 11116 /A"v$"e A>"e*>en/#5#Li*/#( /A"v$"e 1li*/#, /C$n/e,-$ /#<%&%Q&, %/# 4/e& lin)#, %/# 4/e& >$l,n#, /C$n/e,-$ J$O#-# ) 2 /A"v$"e #, 3 %/# 4/e& i, J3 #, = :#ll$>(# 7eo,(/5$))3

61 C$0i# >$n/eB-$ >$""en/e -$ /#<,lei"$ 0#"# $ n$v$ nA 16 ,or (i = !3 i R Q3 ++i) ,or (J = !3 J R Q3 ++J) #, -./#<,lei"$%i&%J& = /#<%i&%J&3 #, -./#<,lei"$%lin)#&%>$l,n#& = J$O#-#3 61 A>"e*>en/# n$v# J$O#-# 16 #, -.0"$ i:$I":#$ = 1li*/#3 61 5$v$ nA I #>"e*>en/#-$ n$ in>i$ -# li*/# 16 #, -.?il)$E*+,e"-# = 5@LL3 61 5$v$ #in-# nA n8$ /e: ?il)$* 16 1li*/# = #, 3 61 Li*/# #O$"# #0$n/# 0#"# n$v$ nA 16 4 re'%r/ #, 3 61 De/$"n# ,: 0$n/ei"$ 0#"# $ in>i$ -# li*/# 16

"!

funo ("$>,"#Mel)$"L#n>e(), procura a melhor jo(ada na rvore cuja rai* rece'ida como ar(umento#

61111 1 1 ("$>,"#Mel)$"L#n>e()F ("$>,"# # :el)$" J$O#-# n# ;"v$"e >,J# "#i9 I 1 "e>e<i-# >$:$ #"O,:en/$ 1 1 A"O,:en/$*F #"v$"e (en/"#-#) \ 0$n/ei"$ 0#"# # ;"v$"e -e J$O$ 1 J$O#-$" (en/"#-#) \ $ J$O#-$" (X $, H) +,e /e: # ve9 1 :el)$" (*#-#) \ 0$n/ei"$ 0#"# $ nA +,e "e0"e*en/# # :el)$" J$O#-# 1 v#l$" (*#-#) \ $ v#l$" -$ :el)$" nA 1 11116 vo & ("$>,"#Mel)$"L#n>e(/A"v$"e #"v$"e, /C$n/e,-$ J$O#-$", /A"v$"e 1:el)$", /' 1v#l$") 2 /A"v$"e 0, :el)$"23 /' v#l$"23 , (G#"v$"e-.?il)$E*+,e"-#) 2 61 5A /e":in#l 16 1v#l$" = Av#li#(#"v$"e-./#<,lei"$,J$O#-$")3 61 Av#li# nA e*/#/i>#:en/e 16 1:el)$" = #"v$"e3 4 e1#e 2 61 ("$>,"# :el)$" l#n>e en/"e $* ?il)$* -$ n$ 16 0 = #"v$"e-.?il)$E*+,e"-#3 61 C$:e7# >$: $ ?il)$ :#i* P e*+,e"-# 16 ("$>,"#Mel)$"L#n>e(0, J$O#-$", :el)$", v#l$")3 1:el)$" = 03 61 E*/e I $ :el)$" l#n>e #/I #+,i 16 61 61 61 61 (#"# >#l>,l#" $ v#l$" :ni:$ -e ,: nA MI5, *e"; ,/ili9#-$ $ ?#/$F :in( , U) = -:# (- , -U)= ($" i**$, +,#n-$ $ v#l$" -e ,: nA MI5 I en>$n/"#-$, ele /e: *e, *in#l inve"/i-$= De0$i*, en>$n/"#-*e $ :#i$" -e*/e* v#l$"e* e inve"/e-*e $ *in#l -e*/e :#i$" v#l$"= 16 16 16 16

, (#"v$"e-./i0$De5$ == MI5) 1v#l$" = -1v#l$"3 0 = 0-.0"$ i:$I":#$3 82 1e (0) 2 61 ("$>,"# :el)$" l#n>e -en/"e $* nA* "e*/#n/e* 16 ("$>,"#Mel)$"L#n>e(0, J$O#-$", L:el)$"2, Lv#l$"2)3 , (#"v$"e-./i0$De5$ == MI5) v#l$"2 = -v#l$"23 61 Ke" >$:en/;"i$ *$<"e >;l>,l$ -e :ni:$* 16 , (v#l$"2 . 1v#l$") 2 61 Ce $ v#l$" "e>I: en>$n/"#-$ ?$" 16 1v#l$" = v#l$"23 61 :#i$" -$ +,e $ Bl/i:$ v#l$", 16 1:el)$" = 03 61 e*/e nA /$"n#-*e $ :el)$"= 16

4 4

0 = 0-.0"$ i:$I":#$3 , (#"v$"e-./i0$De5$ == MI5) 1v#l$" = -1v#l$"3 61 Ke" >$:en/;"i$ #>i:# *$<"e >;l>,l$ -e :ni:$* 16 4 4

funo Av#li#(), apresentada a se(uir, avalia estaticamente a posio do ta'uleiro para o dado jo(ador#

61111 1 1 Av#li#()F 1 1 1 1

Av#li# e*/#/i>#:en/e # 0$*i78$ -$ /#<,lei"$ 0#"# $ -#-$ J$O#-$"= H "e*,l/#-$ -# #v#li#78$ I $ nB:e"$ -e lin)#*, >$l,n#* e -i#O$n#i* +,e 0$-e: *e" 0"een>)i-#* 0el$ J$O#-$" :en$* $ nB:e"$ -e*/#* +,e 0$-e: *e" 0"een>)i-#* 0$" *e, $0$nen/e=

"" 1 A"O,:en/$*F /#< (en/"#-#) - $ /#<,lei"$ +,e *e"; #v#li#-$ 1 J$O#-$" (en/"#-#) - $ J$O#-$" +,e /e: # ve9 1 1 De/$"n$F $ v#l$" -# #v#li#78$ 1 11116 /' Av#li#(/C$n/e,-$ /#<%&%Q&, /C$n/e,-$ J$O#-$") %/# 4/e& i, J3 /C$n/e,-$ $0$nen/e3 61 H $0$nen/e -$ J$O#-$" 16 /' v#l$" = !, 61 5B:e"$ -e lin)#*, >$l,n#* e -i#O$n#i* 16 61 +,e $ J$O#-$" 0$-e 0"een>)e" 16 v#l$"H0$nen/e = !3 61 I-e: 0#"# *e, $0$nen/e 16 61 Ke"i?i># +,#n/#* lin)#* $ J$O#-$" 0$-e 0"een>)e" 16 ,or (i = !3 i R Q3 ++i) , ( ((/#<%i&%!& == J$O#-$") NN (/#<%i&%!& == KAZIH)) LL ((/#<%i&%1& == J$O#-$") NN (/#<%i&%1& == KAZIH)) LL ((/#<%i&%2& == J$O#-$") NN (/#<%i&%2& == KAZIH)) ) v#l$"++3 61 Ke"i?i># +,#n/#* >$l,n#* $ J$O#-$" 0$-e 0"een>)e" 16 ,or (J = !3 J R Q3 ++J) , ( ((/#<%!&%J& == J$O#-$") NN (/#<%!&%J& == KAZIH)) LL ((/#<%1&%J& == J$O#-$") NN (/#<%1&%J& == KAZIH)) LL ((/#<%2&%J& == J$O#-$") NN (/#<%2&%J& == KAZIH)) ) v#l$"++3 61 Ke"i?i># +,#n/#* -i#O$n#i* $ J$O#-$" 0$-e 0"een>)e" 16 , ( ((/#<%!&%!& == J$O#-$") NN (/#<%!&%!& == KAZIH)) LL ((/#<%1&%1& == J$O#-$") NN (/#<%1&%1& == KAZIH)) LL ((/#<%2&%2& == J$O#-$") NN (/#<%2&%2& == KAZIH)) ) v#l$"++3 , ( ((/#<%!&%2& == J$O#-$") NN (/#<%!&%2& == KAZIH)) LL ((/#<%1&%1& == J$O#-$") NN (/#<%1&%1& == KAZIH)) LL ((/#<%2&%!& == J$O#-$") NN (/#<%2&%!& == KAZIH)) ) v#l$"++3 $0$nen/e = (J$O#-$" == X) T H F X3 61 Ke"i?i># +,#n/#* lin)#* $ $0$nen/e 0$-e 0"een>)e" 16 ,or (i = !3 i R Q3 ++i) , ( ((/#<%i&%!& == $0$nen/e) NN (/#<%i&%!& == KAZIH)) LL ((/#<%i&%1& == $0$nen/e) NN (/#<%i&%1& == KAZIH)) LL ((/#<%i&%2& == $0$nen/e) NN (/#<%i&%2& == KAZIH)) ) v#l$"H0$nen/e++3 61 Ke"i?i># +,#n/#* >$l,n#* $ $0$nen/e 0$-e 0"een>)e" 16 ,or (J = !3 J R Q3 ++J) , ( ((/#<%!&%J& == $0$nen/e) NN (/#<%!&%J& == KAZIH)) LL ((/#<%1&%J& == $0$nen/e) NN (/#<%1&%J& == KAZIH)) LL ((/#<%2&%J& == $0$nen/e) NN (/#<%2&%J& == KAZIH)) ) v#l$"H0$nen/e++3 61 Ke"i?i># +,#n/#* , ( ((/#<%!&%!& == $0$nen/e) ((/#<%1&%1& == $0$nen/e) ((/#<%2&%2& == $0$nen/e) v#l$"H0$nen/e++3 , ( ((/#<%!&%2& == $0$nen/e) ((/#<%1&%1& == $0$nen/e) ((/#<%2&%!& == $0$nen/e) v#l$"H0$nen/e++3 4 -i#O$n#i* $ $0$nen/e 0$-e 0"een>)e" 16 NN (/#<%!&%!& == KAZIH)) LL NN (/#<%1&%1& == KAZIH)) LL NN (/#<%2&%2& == KAZIH)) ) NN (/#<%!&%2& == KAZIH)) LL NN (/#<%1&%1& == KAZIH)) LL NN (/#<%2&%!& == KAZIH)) )

re'%r/ (v#l$" - v#l$"H0$nen/e)3

*+erc"cios: 7ara completar o jo(o, faa o se(uinte: !# =screva uma funo que faa uma apresentao do jo(o para o usurio, informando como ele deve introdu*ir dados $i#e#, suas jo(adas% para o pro(rama# R7rottipo: vo & A0"e*en/#>#$(vo &)#S

"4

"# =screva uma funo que iniciali*a com KAZIH todas as posi3es de um ta'uleiro# R7rottipo: vo & Ini>i#li9#[#<,lei"$(/C$n/e,-$ /#<,lei"$%&%Q&)#S 4# =screva uma funo que per(unta ao usurio se ele deseja ser X ou H e, ento, rece'e e valida a opo introdu*ida pelo mesmo# $& jo(ador X sempre comea#% R7rottipo: /' E*>$l)eH0>#$(vo &)#S 6# D# =screva =screva uma uma funo funo que que apresenta verifica a se situao jo(o corrente est do jo(o# R7rottipo:
vo &/#<,lei"$%&%Q&)#S

A0"e*en/#J$O$(/C$n/e,-$

encerrado#

R7rottipo:

%/# 4/e&-

J$O$[e":in#-$(/C$n/e,-$

/#<,lei"$%&%Q&)#S

H# =screva uma funo que rece'e uma jo(ada do usurio# $;u(esto: solicite ao usurio para informar um valor entre ! e N, representando um quadrado va*io do ta'uleiro $numerado de ! a N% e, ento, tradu*a esta escolha para uma posio do ta'uleiro#% R7rottipo: vo & E*>$l)eJ$O#-#(/C$n/e,-$ /#<,lei"$%&%Q&, /C$n/e,-$ J$O#-$")#S J# =screva uma funo que retorna ! se o jo(ador passado como ar(umento vencedor da partida e 0 em caso contrrio# R7rottipo: %/# 4/e& E)Ken>e-$"(/C$n/e,-$ /#<,lei"$%&%Q&, /C$n/e,-$ J$O#-$")#S L# =screva uma funo :#in() que faa o se(uinte: L#! Declare uma varivel representando um ta'uleiro de jo(o/da/velha# L#" Declare duas variveis representando os dois jo(adores $i#e#, o computador e o usurio%# L#4 presente o jo(o para o usurio# L#6 8niciali*e o ta'uleiro do jo(o# L#D 7ermita que o usurio escolha que jo(ador $X ou H% ele deseja ser# L#H ;e o computador comear o jo(o $i#e#, se ele for X%, escolhe a jo(ada inicial usando o mtodo minima- apresentado# L#J =nquanto o jo(o no tiver terminado faa o se(uinte: L#J#! presente a situao corrente do jo(o# L#J#" ;olicite e rece'a a jo(ada do usurio# L#J#4 ;e o usurio no (anhar o jo(o no 5ltimo lance, faa a melhor jo(ada usando minimaL#L 0erifique quem venceu o jo(o $ou se foi empate% e apresente o resultado para o usurio# N# Oinalmente, crie um arquivo contendo as fun3es apresentadas aqui e aquelas que voc. criou se(uindo as su(est3es acima, compile e teste o pro(rama resultante#

Anda mungkin juga menyukai