Você está na página 1de 10

rvores Binrias

grau dos ns
012

INF01203 Estruturas de Dados


ordenadas
sub-rvore da esquerda sub-rvore da direita

rvores Binrias

=
rvore qualquer

Tipos de rvores Binrias

rvore Binria

Tipos de rvores Binrias

Estritamente
Binria

Binria
Completa

Binria
Cheia

0 ou 2 filhos

Sub-rvores vazias
no ltimo ou
penltimo nvel

Sub-rvores vazias
somente no ltimo nvel

ZigueZigue-zague
Ns interiores possuem exatamente
uma sub-rvore vazia

Tipos de rvores Binrias

rvore Binria

Dados os tipos de rvores:

Comprimento de caminho de uma rvore

estritamente binria
completa
cheia
zigue-zague

tempo de execuo

Qual rvore possui altura mxima ?

zigue-zague
*

Qual rvore possui altura mnima ?

cheia

Exemplos de rvores Binrias

Implementao

+
Endereo da raiz

A
*

200

a
150

350

d
100

170 250

500

400

600

rvores Binrias - vantagens

Transformao: n-ria em binria


Irmo seguinte

Otimizao de alocao de memria


Mais fceis de manipular
Implementao de operaes muito
simplificada

Primeiro filho

Transformar rvore n-ria em binria


E

Transformao: n-ria em binria


1. O primeiro filho de um nodo passa a ser seu
filho esquerda na rvore binria
2. Os demais filhos de um nodo passam a ser
filhos direita do seu irmo imediato esquerda
3. Executar o mesmo processo para cada nodo da
rvore
Filho esquerda = primeiro filho
Filho direita = irmo seguinte

Transformao: n-ria em binria


A

A
B

D
G

A
C

C
D

A
B

F
G

Reconstituio rvore n-ria


A

B
C

rvore original
A

Converter Binria
inserir Y filho direita de A
inserir X filho esquerda Y
inserir Z filho direita Y

K
B

rvore modificada

B
E

Exerccios

G
L

Transformao de Floresta em Binria

Transformao de Floresta em Binria


A

Para converter uma floresta em rvore binria,


basta considerar as razes das rvores como ns
irmos e aplicar a converso anterior
A

H
D

E
E

L
F

M
M

TAD : Estrutura de Dados


raiz

raiz

Implementao de rvores Binrias

C
D

Tipo
Pnodo = Nodo;
Nodo = registro
esq : Pnodo;
info: Dados;
dir : Pnodo
fim;

Nodo
esq

TAD : Operaes

info

dir

Inicializa
raiz

raiz

Inicializa
Insere
raiz
meio
folha

Consulta
Remove
Destri
D

C
D

Criar uma rvore vazia

C
D

Endereo
da raiz

proc inicializa(var a: Pnodo);


incio
a := nil
fim inicializa;

Insere raiz

Insere: filho esqueda


raiz

raiz

A
B

C
D

C
D

Alocar nodo raiz


proc insereRaiz(var a: Pnodo; info: Dados);
var raiz: Pnodo;
incio
alocar(raiz);
raiz.esq := raiz.dir := nil;
raiz.info := info;
a := raiz;
fim insereRaiz;

Insere: filho direita


proc insereDir(var a: Pnodo; infoPai, infoFilho: Dados);
var pai, novo: Pnodo;
incio
pai := localiza(a, infoPai);
se pai nil
ento
se pai.dir nil
ento erro(Nodo j possui sub-rvore direita)
seno incio {insere o novo nodo}
aloca(novo);
novo.dir := novo.esq := nil;
novo.info := infoFilho;
pai.dir
:= novo;
fim;
fim insereDir;

proc insereEsq(var a: Pnodo; infoPai, infoFilho: Dados);


var pai, novo: Pnodo;
incio
pai := localiza(a, infoPai);
se pai nil
ento
se pai.esq nil
ento erro(Nodo j possui sub-rvore esquerda)
seno incio {insere o novo nodo}
aloca(novo);
novo.dir := novo.esq := nil;
novo.info := infoFilho;
pai.esq
:= novo;
fim;
fim insereEsq;

TAD: Operaes sobre rvores Binrias


Pnodo = Nodo;
Nodo = registro
esq : Pnodo;
info: Dados;
dir : Pnodo
fim;
proc inicializa(var a: Pnodo);
// cria uma rvore vazia
proc insereRaiz(var a: Pnodo; info: Dados);
// aloca nodo raiz e insere dado
proc insereEsq(var a: Pnodo; InfoPai, InfoFilho: Dados);
// insere um nodo na sub-rvore esquerda
proc insereDir(var a: Pnodo; InfoPai, InfoFilho: Dados);
// insere um nodo na sub-rvore direita

Consulta Nodos

Caminhamentos em rvores Binrias

acesso sempre atravs da raiz


cada nodo deve ser visitado uma vez, e apenas
uma vez

raiz

A
B

Visita a um nodo

D
G

acesso a um nodo
para realizar alguma operao

Caminhamentos

Caminhamentos

mtodo de percurso sistemtico de todos os


nodos de uma rvore, de modo a que cada nodo
seja visitado exatamente uma vez

um caminhamento define uma seqncia de


nodos
cada nodo passa a ter um nodo seguinte, ou um
nodo anterior, ou ambos (exceto rvore com 1 s
nodo)
seqncia de nodos depende do caminhamento

A
realizar as
operaes

A
B
E

C
F

Ex: Caminhamento 1:

D
G

A-B-C-D-E-F-G
Caminhamento 2:
A-B-E-C-D-F-G

B
E

C
F

D
G

Principais Caminhamentos

Caminhamentos
Pr-Fixado esquerda

raiz

.Visita a raiz
.Percorre a sub-rvore esquerda
.Percorre a sub-rvore direita

a-b-d-e-c-f-g
Sub-rvore
esquerda

Central esquerda

Sub-rvore
direita

.Percorre a sub-rvore esquerda


.Visita a raiz
.Percorre a sub-rvore direita

d-b-e-a-f-c-g
d

e f

Ps-Fixado esquerda

.Percorre a sub-rvore esquerda


.Percorre a sub-rvore direita
.Visita a raiz

e f

d-e-b-f-g-c-a

Caminhamentos

Exemplo 02
130

Pr-Fixado direita
.Visita a raiz
.Percorre a sub-rvore direita
.Percorre a sub-rvore esquerda

a-c-g-f-b-e-d

100

200

Central direita
.Percorre a sub-rvore direita
.Visita a raiz
.Percorre a sub-rvore esquerda

.Central esquerda?

g-c-f-a-e-b-d
Ps-Fixado direita
.Percorre a sub-rvore direita
.Percorre a sub-rvore esquerda
.Visita a raiz

g-f-c-e-d-b-a

83

120

150

230

83 - 100 - 120 - 130 - 150 - 200 - 230


e f

.Central direita?

230 - 200 - 150 - 130 - 120 - 100 - 83

Exemplo: expresso aritmtica

Percorrer: Pr-Fixado Esquerda


+

*
Central E A
.esquerda
.raiz
.direita

Pr-fixado E
.raiz
.esquerda
.direita

A
+

*
D

raiz

/
B

qq = nil

/
A

D
B

Ps-Fixado E
.esquerda
.direita
.raiz
*

Percorrer: Pr-Fixado Esquerda

q
3

1- 2 - 3 - 4 - 5 ...

Recursividade em rvores
a

proc preFixado(a: Pnodo);


var paux: Pnodo; {apontador auxiliar}
s: Pilha;
{simbolizando a pilha}
incio
push(s,a);
{coloca na pilha o endereo da raiz}
enquanto (consulta(s,paux)=true)
{enquanto houver alguma coisa na pilha}
faa incio
se(pop(s,paux)=true) {tira endereo do topo da pilha}
ento incio
visita(paux);
{efetua a operao desejada no nodo}
push(s,paux.dir); {empilha raiz da sub-rvore direita}
push(s,paux.esq) {empilha raiz da sub-rvore esquerda}
fim
fim
fim preFixado;

6
7
nil
nil
nil
nil
3
4
2
5
1

raiz
a

raiz

b
sub-rvore
esquerda
d

sub-rvore
direita

sub-rvore
direita
g

sub-rvore
esquerda

rvores

Pr-Fixado Esquerda

Ps-Fixado a Esquerda
proc posFixado(a: pNodo);
{percurso pos-fixado esquerdo, usando recursividade}
incio
se a <> nil
{existe a rvore ou sub-rvore}
ento incio
posFixado(a.esq); {percurso da sub-rvore esquerda}
posFixado(a.dir) {percurso da sub-rvore direita}
visita(a);
{executa operao}
fim

proc preFixado(a: pNodo);


{percurso pr-fixado esquerdo, usando recursividade}
incio
se a <> nil
{existe a rvore ou sub-rvore}
ento incio
visita(a);
{executa operao}
preFixado(a.esq); {percurso da sub-rvore esquerda}
preFixado(a.dir) {percurso da sub-rvore direita}
fim
fim preFixado;

fim posFixado;

a
7

a
1
2

Central Esquerda

TAD: Operaes sobre rvores Binrias (parcial)

proc central(a: pNodo);


{percurso central esquerda, usando recursividade}
incio
se a <> nil
{existe a rvore ou sub-rvore}
ento incio
central(a.esq); {percurso da sub-rvore esquerda}
visita(a);
{executa operao}
central(a.dir) {percurso da sub-rvore direita}
fim

proc inicializa(var a: Pnodo);


// cria uma rvore vazia
proc insereRaiz(var a: Pnodo; info: Dados);
// aloca nodo raiz e insere dado
proc insereEsq(var a: Pnodo; InfoPai, InfoFilho: Dados);
// insere um nodo na sub-rvore esquerda
proc insereDir(var a: Pnodo; InfoPai, InfoFilho: Dados);
// insere um nodo na sub-rvore direita
proc preFixado(a: pNodo);
// percurso pr-fixado esquerdo, usando recursividade
proc posFixado(a: pNodo);
// percurso ps-fixado esquerdo, usando recursividade
proc central(a: pNodo);
// percurso central esquerda, usando recursividade
proc constroi(var a: Pnodo);
// constri uma (sub)rvore e devolve o endereo da raiz
funo copia(a: Pnodo):Pnodo;
// monta uma cpia de uma rvore a, devolvendo o endereo da raiz

fim central;

a
4
2
1

6
3

Você também pode gostar