Você está na página 1de 49

!

"#$%& LlcenclaLura em lnformuca


()$*)+,)-.& LsLruLura de dados e algorlLmos !/0& 60hs
1#%23$$%#& Serglo Souza CosLa 456.),& skosLa[gmall.com
0"#6.: 2010.2,2010.1 e 2009.2 13#7%8%& 3
9-%:;363$<#3:2/2012


=#>%#3$ ?)-@#).$




rvores Binrias
rvore blnrla e um caso especlal de rvore em que nenhum
nodo Lem grau superlor a 2, lsLo e, nenhum nodo Lem mals
que dols lhos.
AdlclonalmenLe, para rvores blnrlas exlsLe um "senso
de poslo", ou se[a, dlsungue-se enLre uma subrvore
esquerda e uma dlrelLa. Lxemplos
a
b
a
b
a
b c
rvores Binrias
Uma rvore binria uma rvore que pode
ser nula, ou ento tem as seguintes
caractersticas:
existe um nodo especial denominado raiz;
os demais nodos so particionados em T
1
, T
2

estruturas disjuntas de rvores binrias;
T
1
denominada subrvore esquerda e T
2
,
subrvore direita da raiz.
rvores Binrias
Uma rvore binria uma rvore que pode
ser nula, ou ento tem as seguintes
caractersticas:
existe um nodo especial denominado raiz;
os demais nodos so particionados em T
1
, T
2

estruturas disjuntas de rvores binrias;
T
1
denominada subrvore esquerda e T
2
,
subrvore direita da raiz.
O
b
serv
em
a

recu
rsiv
id
a
d
e n
a

su
a
d
efin
i
o
Exemplo
Chaves de campeonatos
RVORE BINRIA - EXEMPLO
Chaves de campeonatos
Terminologias
rvore estritamente binria: cada n tem grau 0
ou 2, ou seja, todo n tem 0 ou 2 filho
a)
b)
Terminologias
rvore estritamente binria: cada n tem grau 0
ou 2, ou seja, todo n tem 0 ou 2 filho
a)
b)
Terminologias
rvore binria completa uma rvore estritamente
binria na qual todo n que apresente alguma sub-
rvore vazia est localizado no ltimo ou no penltimo
nvel da rvore
a) b)
Terminologias
rvore binria completa uma rvore estritamente
binria na qual todo n que apresente alguma sub-
rvore vazia est localizado no ltimo ou no penltimo
nvel da rvore
a) b)
Terminologias
rvore binria cheia quando todos os ns internos
tem grau 2 e todas as folhas esto no mesmo nvel
a)
b)
Terminologias
rvore binria cheia quando todos os ns internos
tem grau 2 e todas as folhas esto no mesmo nvel
a)
b)
ercurso em rvores
13#*"#$% 36 @#>%#3 A)-@#).
1#B5%#836& vlslLa a ralz, depols a sub-rvore da
esquerda e depols dlrelLa.
465%#836& vlslLa a sub-rvore esquerda, depols a
ralz, e nalmenLe a sub-rvore dlrelLa.
1C$5%#836& vlslLa a sub-rvore da esquerda, depols
da dlrelLa e por ulumo lmprlme a ralz.
Lxemplo de percurso pre-ordem
+
1 *
6 2
+1*62
Lxemplo de percurso em-ordem
+
1 *
6 2
1+6*2
Lxemplo de percurso ps-ordem
+
1 *
6 2
162*+
Lxemplo de percurso ps-ordem
+
1 *
6 2
162*+
U
m
a
lg
o
ritm
o

d
e
p
e
rcu
rso

p

s-o
rd
e
m

co
n
ve
rte

n
o
ta

o
in
fixa

p
a
ra
p
o
sfixa

9#>%#3 ?)-@#).& 0(9
1lpo de dados absLraLo da rvore blnrla:

Vazia: () A
// elemento, arvore esquerda direita
Nodo: E " SAE " SAD A

9#>%#3 ?)-@#).& 0(9
1lpo de dados absLraLo da rvore blnrla:

Vazia: () A
// elemento, arvore esquerda direita
Nodo: E " SAE " SAD A

Que rvore essa ?
A = Nodo (5, Vazia,
Nodo (8,
Nodo (4, Vazia, Vazia),
Vazia)))
9#>%#3 ?)-@#).& 0(9
1lpo de dados absLraLo da rvore blnrla:

Vazia: () A
// elemento, arvore esquerda direita
Nodo: E " SAE " SAD A

Que rvore essa ?
A = Nodo (5, Vazia,
Nodo (8,
Nodo (4, Vazia, Vazia),
Vazia)))
5
8
4
rvore
vazia
9#>%#3 ?)-@#).& 0(9
Cperaes acessoras:
sae:: A A // retorna a subarvore esquerda
sad:: A A // retorna a subarvore direita
element :: A E // retorno o elemento do n






4D3#*7*)%
A = Nodo (5, Nil, Nodo (8, Nodo (4, Vazia, Vazia),
Vazia)))

B = sae (A)
C = sad (A)
D = sae(C)
X = element (D)
Y = element (A)
4D3#*7*)%
A = Nodo (5, Nil, Nodo (8, Nodo (4, Vazia, Vazia),
Vazia)))

B = sae (A)
C = sad (A)
D = sae(C)
X = element (D)
Y = element (A)
5
8
4
A
4D3#*7*)%
A = Nodo (5, Nil, Nodo (8, Nodo (4, Vazia, Vazia),
Vazia)))

B = sae (A)
C = sad (A)
D = sae(C)
X = element (D)
Y = element (A)
5
8
4
A
B
4D3#*7*)%
A = Nodo (5, Nil, Nodo (8, Nodo (4, Vazia, Vazia),
Vazia)))

B = sae (A)
C = sad (A)
D = sae(C)
X = element (D)
Y = element (A)
5
8
4
A
B
C
4D3#*7*)%
A = Nodo (5, Nil, Nodo (8, Nodo (4, Vazia, Vazia),
Vazia)))

B = sae (A)
C = sad (A)
D = sae(C)
X = element (D)
Y = element (A)
5
8
4
A
B
C
D
4D3#*7*)%
A = Nodo (5, Nil, Nodo (8, Nodo (4, Vazia, Vazia),
Vazia)))

B = sae (A)
C = sad (A)
D = sae(C)
X = element (D)
Y = element (A)
5
8
4
A
B
C
D
4D3#*7*)%
A = Nodo (5, Nil, Nodo (8, Nodo (4, Vazia, Vazia),
Vazia)))

B = sae (A)
C = sad (A)
D = sae(C)
X = element (D)
Y = element (A)
5
8
4
A
B
C
D
4D3#*7*)%$ #3$%,>)8%$
Alnda sem codlcar em C a nossa rvore, faremos os
segulnLes exerclclos.
odem fazer no papel ou bloco de noLas, no
preclsem compllar (apenas menLalmenLe).
usando recurslvldade e apenas as quaLro operaes
vlsLas anLerlormenLe, vamos fazer os segulnLes
exerclclos.
4D3#*7*)%$ #3$%,>)8%$
1. Some os valores dos elemenLos de uma arvore blnrla

int soma (ArvBin *a) {
if (a == Vazia())
return 0;




}
4D3#*7*)%$ #3$%,>)8%$
1. Some os valores dos elemenLos de uma arvore blnrla

int soma (ArvBin *a) {
if (a == Vazia())
return 0;

return elem(a)
+ soma (sae(a))
+ soma (sad(a));
}
4D3#*7*)%$ #3$%,>)8%$
1. 8eLorne a alLura de uma rvore blnarla. Cnde a 9,<"#. e
o Lamanho do malor camlnho desde a ralz aLe uma folha.
or denlo, a alLura de uma rvore vazla e -1.



int altura(ArvBin *a) {





}
4D3#*7*)%$ #3$%,>)8%$
1. 8eLorne a alLura de uma rvore blnarla. Cnde a 9,<"#. e
o Lamanho do malor camlnho desde a ralz aLe uma folha.
or denlo, a alLura de uma rvore vazla e -1.



int altura(ArvBin *a) {
if (a == Vazia())
return -1;



}
4D3#*7*)%$ #3$%,>)8%$
1. 8eLorne a alLura de uma rvore blnarla. Cnde a 9,<"#. e
o Lamanho do malor camlnho desde a ralz aLe uma folha.
or denlo, a alLura de uma rvore vazla e -1.



int altura(ArvBin *a) {
if (a == Vazia())
return -1;
return maior(
altura (sae (a)),
altura (sad (a))
) + 1;
}
4D3#*7*)%$ #3$%,>)8%$
1. 8eLorne a alLura de uma rvore blnarla. Cnde a 9,<"#. e
o Lamanho do malor camlnho desde a ralz aLe uma folha.
or denlo, a alLura de uma rvore vazla e -1.



int altura(ArvBin *a) {
if (a == Vazia())
return -1;
return maior(
altura (sae (a)),
altura (sad (a))
) + 1;
}
4D3#*7*)%$ #3$%,>)8%$
1. 8eLorne a alLura de uma rvore blnarla. Cnde a 9,<"#. e
o Lamanho do malor camlnho desde a ralz aLe uma folha.
or denlo, a alLura de uma rvore vazla e -1.



int altura(ArvBin *a) {
if (a == Vazia())
return -1;
return maior(
altura (sae (a)),
altura (sad (a))
) + 1;
}
int maior (int v1, int v2)
{
if (v1 > v2)
return v1 ;
else return v2;
}
LsLudem bem os concelLos
vlsLos nesLa aula anLes de
prossegulr. L faa as
auvldades.
LnLendldo esLes concelLos a
codlcao e slmples, e
possul aLe slmllarldades
com a codlcao da llsLa.
!%8)E*.FG%
A rvore blnrla e represenLado pela esLruLura
abalxo.
typedef struct ArvBin {
int elem;
struct ArvBin *sae;
struct ArvBin *sad;
} ArvBin;
!%8)E*.FG%
Cperaes consLruLoras
ArvBin* Vazia () {
return NULL;
}
ArvBin* Nodo (int elem, ArvBin* sae, ArvBin* sad ) {
ArvBin* a = (ArvBin*)malloc (sizeof (ArvBin));
a->elem = elem;
a->sad = sad;
a->sae = sae;
return a;
}
!%8)E*.FG%
Cperaes consLruLoras
ArvBin* Vazia () {
return NULL;
}
ArvBin* Nodo (int elem, ArvBin* sae, ArvBin* sad ) {
ArvBin* a = (ArvBin*)malloc (sizeof (ArvBin));
a->elem = elem;
a->sad = sad;
a->sae = sae;
return a;
}
!%8)E*.FG%
Cperaes consLruLoras
ArvBin* Vazia () {
return NULL;
}
ArvBin* Nodo (int elem, ArvBin* sae, ArvBin* sad ) {
ArvBin* a = (ArvBin*)malloc (sizeof (ArvBin));
a->elem = elem;
a->sad = sad;
a->sae = sae;
return a;
}
!%8)E*.FG%
Cperaes consLruLoras
ArvBin* Vazia () {
return NULL;
}
ArvBin* Nodo (int elem, ArvBin* sae, ArvBin* sad ) {
ArvBin* a = (ArvBin*)malloc (sizeof (ArvBin));
a->elem = elem;
a->sad = sad;
a->sae = sae;
return a;
}
!%8)E*.FG%
Cperaes consLruLoras
ArvBin* Vazia () {
return NULL;
}
ArvBin* Nodo (int elem, ArvBin* sae, ArvBin* sad ) {
ArvBin* a = (ArvBin*)malloc (sizeof (ArvBin));
a->elem = elem;
a->sad = sad;
a->sae = sae;
return a;
}
!%8)E*.FG%
Cperaes reLornar os aLrlbuLos da rvore.
int elem (ArvBin* b) { return b->elem;}
ArvBin* sae (ArvBin* b) { return b->sae;}
ArvBin* sad (ArvBin* b) { return b->sad;}
!%8)E*.FG%
Cdlgo para vlsuallzar uma rvore blnrla delLada"
void mostra (ArvBin *a, int n) {
if (a) {
int i;
mostra (sad(a), n+1);
for (i = 0; i < n; i++) printf ("\t");
printf ("%d\n", elem(a));
mostra (sae(a), n+1);
}
}
H)$".,)I.FG%
23
35
28
15
r
LxperlmenLem Lodos os
cdlgos felLos nesLa aula e
as auvldades posLadas no
slLe.

ALe logo !