,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#
"
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
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
,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#
=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#
!# :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: (
& 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#
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
=-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")
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
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#
!"
;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
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
!6
# + - 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
!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#
& 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)) )
*+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#