Você está na página 1de 36

rvore

Centro Federal de Educao Tecnolgica Celso Suckow da Fonseca


CEFET-RJ
1
rvore

As listas encadeadas apresentam grande flexibilidade sobre as


representaes contguas de estrutura de dados, porm sua
forte caracterstica sequencial representa o seu ponto fraco.
A movimentao ao longo das listas feita alcanando um n a cada vez.

Muitas vezes necessrio empregar


estruturas mais complexas do que as
puramente sequenciais.
Dentre essas estruturas destacam-se as
rvores (estrutura hierrquica).

2
Principais Aplicaes

Algoritmos de Compactao

Algoritmos de Busca

Aplicaes em Compiladores

Aplicaes de Inteligncia Artificial

Aplicaes em Computao Grfica

...

3
Definio

Uma rvore um conjunto finito de n elementos denominados

ns.

Quando n = 0 rvore nula.

Supondo n > 0:

Existe um n especial chamado raiz;

Os demais ns so particionados em estruturas disjuntas de rvores (T1, T2, ...,

Tm) denominadas subrvores.

Como as estruturas so disjuntas, garante-se que nenhum n no aparecer em

mais de uma subrvore.


4
Representao Grfica

A maneira mais comum de representar graficamente uma rvore


atravs de sua representao hierrquica.

5
Propriedades

Grau
representa o nmero de subrvores de um n. O n 'A' tem grau 3. J o n
'H' tem grau 2.

Folha (ou terminal)


n que possui grau zero, ou seja, no possui subrvores. Os ns 'E', 'G', 'K',
'L', 'M', 'I' e 'J' so folhas.

Filho
so as razes das subrvores de um n, e este n raiz o pai delas. Os ns
'E', 'F' e 'G' so filhos do n 'B'. Logo 'B' o pai desses ns. E 'B' filho do
n 'A'.

6
Propriedades

Irmos
ns que possuem o mesmo pai. Os ns 'E', 'F' e 'G' so ns irmos.

Nvel
a distncia de um n at a raiz da rvore. Como a raiz possui uma
distncia zero de si prpria, diz-se que ela tem nvel 0. No desenho, os ns
'B', 'C' e 'D' esto no nvel 1 e assim sucessivamente.

Altura (profundidade)
o nvel do n folha que tem o caminho mais longo at a raiz, somando
um.

A altura da rvore do desenho 4.

7
Tipos de rvore

As rvores binrias so as
estruturas com maior filho direito de A

aplicao em
computao.

filho esquerdo
Uma rvore binria quando os
de A
ns NO tem grau superior a 2.
Nenhum n tem mais do que
dois filhos.

8
rvore Binria

Caso a rvore tenha apenas um filho, ento deve-se indicar,


graficamente, se ele o filho direito ou esquerdo.

desenho incorreto
de uma rvore
binria

rvores Binrias

9
Tipos de rvores Binrias

Estritamente Binria
todo n que no folha possui subrvores esquerda e direita no vazias,
ou seja, todo n possui 0 ou 2 filhos.

Uma rvore estritamente binria com n


folhas contm sempre 2n - 1 ns.

10
Tipos de rvores Binrias

Binria Completa
uma rvore estritamente binria onde todos os ns folhas encontram-se
ou no ltimo ou no penltimo nvel da rvore.

11
Tipos de rvores Binrias

Binria Cheia
uma rvore estritamente binria onde os ns folhas se encontram no
ltimo nvel.

12
Representao

13
Exemplo de rvore Binria

Representao de expresses aritmticas


Dada uma expresso aritmtica, sua representao em rvore binria
feita de tal forma que a ordem de prioridade das operaes fica implcita.

+ Regras:
Operador de menor prioridade fica na raiz.
A subexpresso esquerda do operador d
A * origem subrvore esquerda.
A subexpresso direita do operador d
origem subrvore direita.
Operandos sempre aparecem como folhas.
B C
Operadores nunca.

Exemplo: A + B * C
14
rvore Binria de Busca

Busca operao importante em computao.

Array e lista encadeada alto custo.

Para otimizar o processo: ordenao dos elementos.

15
rvore Binria de Busca

Um algoritmo de busca eficiente denominado pesquisa binria.

Usar array no muito eficiente na insero e na remoo devido


necessidade de reorganizao dos elementos para a manuteno da
ordenao.

Usar listas encadeadas resolvem o caso da insero e de remoo (uso de


ponteiros). O problema que os algoritmos de pesquisa so sequenciais.

Usar rvores como estruturas de armazenamento:

rvore Binria de Busca, possui uma boa eficincia na insero, na remoo e


na pesquisa.

16
Operaes

rvore Binria de Busca est sempre ordenada.

Principais operaes:

a. insero

b. busca

c. listagem dos ns

d. remoo

17
Algoritmo para Inserir n

rvore est
vazia?

ok
Inserir na raiz
else

Novo Inserir na
ok
elemento < do subrvore
que raiz? esquerda
else

Inserir na
subrvore
direita

18
Algoritmo para Buscar n

rvore est
vazia?

ok Exibir
mensagem
No

Elemento = ok Mostrar
Raiz? Elemento
else
Buscar na
Elemento < ok subrvore
Raiz?
esquerda
else

Buscar na
subrvore
direita
19
Listagem de elementos

Conceito de visita percorrer a estrutura da rvore.

Existem duas formas:

caminhamento em profundidade

caminhamento em largura

20
Caminhamento em Profundidade

Todos os descendentes de um n filho so processados antes do prximo n


filho.

Pode ocorrer de trs formas: infixa (em ordem), pr-fixa (pr-ordem) ou ps-
fixa (ps-ordem).
Notao Sequncia
Exibir a folha esquerda(E)
a. Infixa (em-ordem) Exibir a raiz (R)
Exibir a folha direita (D)
Exibir a raiz (R)
b. Prefixa (pr-ordem) Exibir a folha a esquerda(E)
Exibir a folha a direita(D)
Exibir a folha a esquerda(E)
c. Psfixa (ps-ordem) Exibir a folha a direita(D)
Exibir a raiz(R)
21
Caminhamento em Profundidade

Observe a rvore binria da expresso


aritmtica: A + B.

em ordem pr ordem ps ordem


22
Caminhamento em Profundidade

Se existe a possibilidade de processar os ns de uma rvore


binria de busca em ordem crescente, pode-se usar o passeio
em-ordem.

Considerando a rvore aritmtica anterior, pode-se verificar:

Formas de passeio Sadas

Em ordem A + B

Pr ordem + A B

Ps ordem A B +

23
Exemplos

Formas de passeio Sadas


B Em ordem A B C D E F
E
Pr ordem D B A C E F
Ps ordem A C B F E D

A C F

D D D

B E B E B E

F A C F A C F
A C

em ordem pr ordem ps ordem


24
Caminhamento em Largura

Ocorre de forma horizontal:

da raiz para todos os ns filhos, depois para os filhos desses ns e assim

sucessivamente.

Cada nvel da rvore pesquisado antes que o prximo nvel seja

iniciado.

O passeio em largura ocorre na forma denominada em-nvel.

25
Algoritmo para Remover n

rvore est
vazia?

ok Exibir
mensagem
No

Elemento = Raiz Remover


ok
e Raiz no tem Elemento e
filhos? else Anular rvore

Elemento != ok
Raiz e Raiz Filho vira Raiz
possui 1 filho else

?
26
Remoo - raiz possui mais de um filho

No existe a possibilidade dos filhos da subrvore esquerda


serem maiores ou iguais raiz; e na subrvore direita, no
podem existir filhos menores do que a raiz.

Identificar o maior elemento da subrvore esquerda e o


posicionar na raiz, ou pegar o menor elemento da subrvore a
direita.

A rvore obtida continua seguindo a definio, ou seja, continua ordenada.

27
Implementao da rvore Binria de Busca
#include <iostream>

using namespace std;

struct no {
int info;
struct no * esq, * dir;
};

typedef struct no * noPtr;

int menu();
int menu2();
void inserir(noPtr *, int);
void remover(noPtr *, int);
bool buscar(noPtr, int);
noPtr maior(noPtr *);
void listarEmOrdem(noPtr);
void listarPreOrdem(noPtr);
void listarPosOrdem(noPtr);
bool arvoreVazia(noPtr); 28
Funo Principal

main() {
int op1, op2, x; bool achei; noPtr raiz = NULL;
do {
op1 = menu();
switch(op1) {
case 1: cout << "\nDigite o elemento que voce deseja inserir: ";
cin >> x;
inserir(&raiz, x); break;
case 2: cout << "\nDigite o elemento que voce deseja remover: ";
cin >> x;
remover (&raiz, x); break;
case 3: op2 = menu2();
if (op2 == 1) listarEmOrdem(raiz);
if (op2 == 2) listarPreOrdem(raiz);
if (op2 == 3) listarPosOrdem(raiz); break;
case 4: cout << "\nDigite o elemento que voce deseja consultar: ";
cin >> x;
achei = buscar(raiz, x);
if (!achei)
cout << "Elemento nao encontrado" << endl; break;
}
} while(op1 != 5);
} 29
Menus
int menu()
{
int opcao;
cout << "\n\n\n---- Menu Principal ----\n\n"
<< "\n1.Inserir no na arvore"
<< "\n2.Remover no na arvore"
<< "\n3.Listar todos os nos da arvore"
<< "\n4.Buscar no"
<< "\n5.Sair"
<< "\nDigite uma opcao: ";
cin >> opcao;
return opcao; int menu2()
} {
int opcao;
cout << "\n\nTipos de listagem:"
<< "\n\t1.Em Ordem"
<< "\n\t2.Pre Ordem"
<< "\n\t3.Pos Ordem"
<< "\n\nEscolha o tipo de listagem: ";
cin >> opcao;
return opcao;
}
30
Funo para Inserir Elemento e
Funo para Verificar rvore Vazia
void inserir(noPtr * p, int x) bool arvoreVazia(noPtr p)
{ {
if (arvoreVazia(*p)) if (p)
{
return false;
*p = new no;
(*p)->info = x; else
(*p)->esq = NULL; return true;
(*p)->dir = NULL; }
}
else
{
if (x<((*p)->info))
inserir(&((*p)->esq), x);
else
inserir(&((*p)->dir), x);
}
}

31
Funo para Buscar Elemento
bool buscar(noPtr p, int x)
{
bool achei = false;
if(arvoreVazia(p))
cout << "\nArvore vazia " << endl;
else
{
if (x == (p-> info))
{
cout << "\nO elemento: " << p->info << " foi encontrado na arvore: \n";
achei = true;
}
else
if (x < (p->info))
buscar((p->esq), x);
else
buscar((p->dir), x);
}
return achei;
}
32
Funo para Remover Elemento
void remover(noPtr *p, int x){ else
noPtr aux; if ((x < ((*p)->info)))
if (arvoreVazia(*p)) remover(&((*p)->esq), x);
cout << "\nArvore vazia" << endl; else
else { remover(&((*p)->dir), x);
if (x == ((*p)->info)) { }
aux = *p; }
if (((*p)->esq) == NULL)
*p = (*p)->dir;
else
if (((*p)->dir) == NULL)
*p = (*p)->esq;
else {
aux = maior(&((*p)->esq));
(*p)->info = aux->info;
}
delete(aux);
cout << "\nO elemento foi removido\n";
}

33
Funo para verificar qual o maior Elemento da Subrvore
esquerda (Remoo)

noPtr maior(noPtr *p) {


noPtr t;
t = *p;
if ((t->dir) == NULL)
{
*p = (*p)->esq;
return(t);
}
else
return (maior(&((*p)->dir)));
}

34
Funes para Listar Elementos

void listarEmOrdem(noPtr p) { void listarPosOrdem(noPtr p) {


if (!arvoreVazia(p)) { if (!arvoreVazia(p)) {
listarEmOrdem(p->esq); listarPosOrdem(p->esq);
cout << "\t" << p->info; listarPosOrdem(p->dir);
listarEmOrdem(p->dir); cout << "\t" << p->info;
} }
} }

void listarPreOrdem(noPtr p) {
if (!arvoreVazia(p)) {
cout << "\t" << p->info;
listarPreOrdem(p->esq);
listarPreOrdem(p->dir);
}
}
35
Referncias

Moraes. Estruturas de Dados e Algoritmos uma abordagem


didtica. Ed. Futura

Markenzon e Szwarcfiter. Estruturas de Dados e seus Algoritmos.


Ed. LTC

Deitel. Como Programar em C/C++. Ed. Pearson

36

Você também pode gostar