Escolar Documentos
Profissional Documentos
Cultura Documentos
2
Principais Aplicaes
Algoritmos de Compactao
Algoritmos de Busca
Aplicaes em Compiladores
...
3
Definio
ns.
Supondo n > 0:
5
Propriedades
Grau
representa o nmero de subrvores de um n. O n 'A' tem grau 3. J o n
'H' tem grau 2.
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.
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
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.
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
+ 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
15
rvore Binria de Busca
16
Operaes
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
caminhamento em profundidade
caminhamento em largura
20
Caminhamento em Profundidade
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
Em ordem A + B
Pr ordem + A B
Ps ordem A B +
23
Exemplos
A C F
D D D
B E B E B E
F A C F A C F
A C
sucessivamente.
iniciado.
25
Algoritmo para Remover n
rvore est
vazia?
ok Exibir
mensagem
No
Elemento != ok
Raiz e Raiz Filho vira Raiz
possui 1 filho else
?
26
Remoo - raiz possui mais de um filho
27
Implementao da rvore Binria de Busca
#include <iostream>
struct no {
int info;
struct no * esq, * dir;
};
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)
34
Funes para Listar Elementos
void listarPreOrdem(noPtr p) {
if (!arvoreVazia(p)) {
cout << "\t" << p->info;
listarPreOrdem(p->esq);
listarPreOrdem(p->dir);
}
}
35
Referncias
36