Anda di halaman 1dari 34

Cincia da Computao

rvores

Introduo
Estruturas estudadas: listas, pilhas e filas.
Entretanto, elas no so adequadas para
representar dados que devem ser dispostos de
maneira hierrquica
rvores so estruturas de dados adequadas
para a representao de hierarquias.

Introduo
Exemplos de estruturas em forma de rvores so:
O organograma de uma empresa;
A diviso de um livro em captulos, sees,
tpicos, etc;
A rvore genealgica de uma pessoa.
Organizao de pastas e diretrios de arquivos
num disco.

Definio
De um modo um pouco mais formal, podemos dizer que
uma rvore um conjunto finito de um ou mais nodos (ns
ou vrtices), tais que:
Existe um nodo denominado raiz;
Os demais nodos formam m>= 0 conjuntos disjuntos s1,
s2, ... , sm, tais que cada um desses conjuntos tambm
uma rvore (denominada sub-rvore).
A forma convencional de representar uma rvore est
indicado na figura seguinte. Esta rvore tem nove ns
sendo A o n raiz.

Representao

Representao n raiz
N Raiz

Representao subrvore direita

Representao subrvore esquerda

Representao
Os conjuntos das sub-rvores tem de ser disjuntos, portanto, a
estrutura indicada na figura seguinte no uma rvore.

Cada n s pode ter um pai

Definies
Se n um n da rvore T ento Tn indica uma sub-rvore de T
com raiz no n n.
Os ns n1, n2, ..., nk das sub-rvores de Tn so chamados de
filhos de n e n o pai destes ns, que so ns irmos. Os ns
B e C so filhos de A e ns irmos.

N filho e irmo do n B

N filho

N filho

N filho e irmo do n H

Definies
Ns sem filhos como os ns D, H, I, F e G so chamados de folhas.
A sub-rvore da esquerda do n A tem raiz em B e a sub-rvore da
direita tem raiz em C, isto est indicado pelos dois ramos saindo de
A.
A ausncia de um ramo na rvore indica uma sub-rvore vazia, como
a sub-rvore da direita do n B.

Raiz da sub-rvore esquerda

Raiz da sub-rvore direita

n folha

n folha

ns folha

Definies
O nvel de um n n pode ser definido do seguinte modo: o
n raiz tem nvel 0, os outros ns tem um nvel que
maior uma unidade que o nvel de seu pai. Na rvore da
figura anterior temos ns nos seguintes nveis:
nvel 0 = A
nvel 1 = B, C
nvel 2 = D, E, F, G
nvel 3 = H, I

Definies
A altura de uma rvore dada pelo nvel mais alto da
rvore.

Representaes
Representao por parnteses aninhados
( A (B) ( C (D (G) (H)) (E) (F (I)) ) )
Grafo
Diagrama de Venn

rvore Binria
Um importante tipo de rvore a rvore binria.
Em uma rvore binria cada n tem no mximo
duas sub-rvores, e quando h somente uma
presente necessrio distinguir entre sub-rvore
esquerda e direita.

Exemplo de rvore binria

rvore Binria
Uma rvore binria A um conjunto finito de
um ou mais nodos (ou ns), tal que:
Existe um n especial denominado raiz da rvore;
Os restantes n-1 ns formam dois conjuntos
disjuntos, Aesq e Adir, chamados de subrvores
esquerda e direita da raiz, as quais so tambm
rvores binrias.

Aplicaes
Como seria a insero da seguinte seqncia
em uma rvore binria?
7 8 2 5 3 10 4

A insero em uma rvore binria deve seguir a


seguinte lei:
Todos elementos menores que a raiz devem ficar na
sub-rvore esquerda;
Todos os elementos maiores que a raiz devem ficar
na sub-rvore direita.

Aplicao

Agora tente voc sozinho, insira as seguinte seqncias:


5 3 7 2 4 6 1, e QUESTAO FCIL

Percursos em rvores
Binrias
O primeiro mtodo, conhecido como percurso
em PR-ORDEM, implica em executar
recursivamente os trs passos na seguinte
ordem:
Visitar a raiz;
Percorrer a sub-rvore da esquerda em pr-ordem;
Percorre a sub-rvore da direita em pr-ordem.

Resumindo : R-E-D

Aplicao
Para a seguinte rvore binria o resultado
do caminhamento PR-ORDEM seria:
FBADCEHGI

Aplicao
Para percorrer a rvore em ORDEM
SIMTRICA (ou EM-ORDEM) executa-se
recursivamente os trs passos na seguinte
ordem:
Percorrer a sub-rvore da esquerda em ordem
simtrica;
Visitar a raiz;
Percorrer a sub-rvore da direita em ordem
simtrica.

Resumindo: E-R-D

Aplicao
Para a seguinte rvore binria o resultado do
caminhamento EM-ORDEM seria:
A B C D E F G H I.

Aplicao
O percurso conhecido como PS-ORDEM
feito a partir dos trs passos na seguinte
ordem:
Percorrer a sub-rvore da esquerda em ps-ordem;
Percorrer a sub-rvore da direita em ps-ordem;
Visitar a raiz;

Resumindo: E-D-R

Aplicao
Para a seguinte rvore binria o resultado
do caminhamento PS-ORDEM seria:
A C E D B G I H F.

Percurso em Pr-Ordem
(RED)
Algoritmo bsico:
1. Se rvore vazia fim
2. visitar o n raiz
3. percorrer em pr-ordem a sub-rvore esquerda
4. percorrer em pr-ordem a sub-rvore direita

ABDCEGFHI

Percurso em Em-Ordem
Algoritmo bsico:
1. Se rvore vazia fim
2. percorrer em ordem a sub-rvore esquerda
3. visitar o n raiz
4. percorrer em ordem a sub-rvore direita

DBAEGCHFI

Percurso em Ps-Ordem
Algoritmo bsico:
1. Se rvore vazia fim
2. percorrer em ps-ordem a sub-rvore esquerda
3. percorrer em ps-ordem a sub-rvore direita
4. visitar o n raiz

DBGEHIFCA

Aplicao
Faa voc sozinho, utilizando os 3 tipos de
caminhamento percorra a seguinte rvore
binria:
*

D
C

Estrutura de Dados de
rvore Binria
typedef struct TipoItem{
int cod;
};
typedef struct TipoNo *TipoApontador;
typedef struct TipoNo {
TipoItem Reg;
TipoApontador Esq, Dir ;
};
typedef TipoApontador TipoArvore;

Inicializa a rvore
void Inicializa (TipoArvore *Arvore)
{
*Arvore = NULL ;
}

Pesquisa item
void Pesquisa( TipoItem *x , TipoApontador *p)
{
if (*p == NULL){
printf ( "Erro : Registro nao esta presente na arvore \n" ) ;
return ;
}
if ( x->cod < (*p)->Reg.cod){
Pesquisa(x, &(*p)->Esq) ;
return ;
}
if ( x->cod > (*p)->Reg.cod)
Pesquisa(x, &(*p)->Dir);
else
*x = (*p)->Reg;
}

Insere
void Insere ( TipoItem x , TipoApontador *p)
{
if (*p == NULL){
*p = (TipoApontador)malloc(sizeof(TipoNo));
(*p)->Reg = x;
(*p)->Esq = NULL;
(*p)->Dir = NULL;
return;
}
if(x.cod < (*p)->Reg.cod){
Insere (x, &(*p)->Esq);
return;
}
else if( x.cod > (*p)->Reg.cod)
Insere (x, &(*p)->Dir );
else printf ("Erro:Registro ja existe na arvore\n");
}

Caminha na rvore
void PreOrdem (TipoArvore p)
{
if (p == NULL ) return;
printf ( "%ld \n" , p->Reg.cod);
PreOrdem (p->Esq) ;
PreOrdem (p->Dir ) ;
}
void EmOrdem (TipoArvore p)
{
if (p == NULL ) return;
EmOrdem (p->Esq) ;
printf ("%ld \n, p->Reg.cod);
EmOrdem (p->Dir ) ;
}

void PosOrdem (TipoArvore p)


{
if (p == NULL ) return;
PosOrdem (p->Esq) ;
PosOrdem (p->Dir ) ;
printf ("%ld \n, p->Reg.cod) ;
}

Anda mungkin juga menyukai