Professional Documents
Culture Documents
Avanados
CAPTULO 6
Prof. Frncila Weidt Neiva
1.
2.
3.
4.
5.
DINMICA
INTRODUO
RVORES
RVORE BINRIA
RVORE BINRIA DE BUSCA
#1
DINMICA.
#1
DINMICA
Dinmica do Dicionrio.
Conteudo
I
I
Introduca o
Arvores
I
I
I
Arvore
Binaria
I
I
Implementaca o
Algoritmos
Arvore
Binaria de Busca
I
I
Definicoes
Conceitos
Algoritmos
Implementaca o
Algoritmos
Exerccios
2 / 117
Introduca o
3 / 117
Pesquisa sequencial
I
Pesquisa sequencial
I
5 / 117
Pesquisa sequencial
I
6 / 117
Pesquisa binaria
I
Pesquisa binaria
I
Arvores
9 / 117
Motivaca o
I
10 / 117
Motivaca o
I
11 / 117
Motivaca o
I
aritmeticas
Representaca o computacional de expressoes
12 / 117
Motivaca o
I
Listas ligadas
I
I
I
Pilhas e filas
I
I
14 / 117
Arvores
I
Arvores
sao estruturas criadas para superar as limitacoes
de listas ligadas, pilhas e filas.
e de arcos.
Consiste de nos
15 / 117
Graficas de Arvores
Representacoes
I
16 / 117
Definicoes
I
I
I
Folhas
I
I
18 / 117
Definicoes
raiz
20
pai
arco
no 13
30
25
15
11
33
filho
10
12
14
18
folhas
19 / 117
Definicoes
I
r
t1
t2
...
t3
tk
20 / 117
Definicoes
I
Grau de um no e o numero
de subarvores de um no.
21 / 117
Exemplo
a
c
d
g
I
Exemplo
I
b e c tem nvel 1;
Nesse exemplo, o no a tem nvel 0; os nos
o no h tem nvel 3.
a
c
d
g
f
i
23 / 117
Definicoes
I
numero
de arcos do mais longo caminho que vai de x ate
uma folha.
Altura da a rvore e o nvel do no folha que tem o mais
longo caminho ate a raiz.
I
I
I
possui:
Toda a rvore com n > 1 nos
I
I
no mnimo 1 folha;
e no maximo n 1 folhas.
24 / 117
Exemplo
I
d
g
f
i
25 / 117
Definicoes
I
Arvore
ordenada: os filhos de cada no estao ordenados
(assume-se ordenaca o da esquerda para a direita).
Exemplos:
a
c
d
g
h
Ordenada
f
g
b
f
i
Nao-ordenada
26 / 117
Arvores
I
qualquer
Note que, a definica o de a rvore nao impoe
Arvores
sao muito utilizadas em sistemas gerenciadores de
banco de dados.
27 / 117
Arvore
Binaria
29 / 117
Arvores
Binarias
I
tem no
Uma a rvore binaria e uma a rvore cujos nos
maximo, dois filhos, portanto, a a rvore binaria tem grau 2.
Exemplos:
30 / 117
Arvores
Binarias
I
31 / 117
Arvores
Binarias
I
Exemplo
A
32 / 117
Arvores
Binarias
I
Arvore
estritamente binaria: cada no possui 0 ou 2 filhos.
33 / 117
Arvores
Binarias
I
Arvore
binaria completa: uma a rvore binaria T com n
nveis e completa se todos os nveis, exceto possivelmente
o ultimo
estao completamente cheios, e o ultimo
nvel tem
a` esquerda.
todos os seus nos
A
Y
34 / 117
Arvores
Binarias
I
Arvore
binaria cheia: Se v e um no tal que alguma
35 / 117
Arvores
Binarias
I
20 nos
21 nos
22 nos
23 nos
36 / 117
Arvores
Binarias
I
I
Representaca o encadeada.
Neste caso, um no sera constitudo por tres campos:
I
I
I
Informaca o;
Ponteiro para no filho a` esquerda;
Ponteiro para no filho a` direita.
Esquematicamente:
38 / 117
Arvores
Binarias
I
class No
{
public:
No();
No();
void setEsq(No * p);
void setDir(No * p);
void setInfo(char c);
No * getEsq();
No * getDir();
char getInfo();
private:
char info;
No * esq;
No * dir;
};
39 / 117
Arvores
Binarias
I
No::No() {}
No::No() {}
void
void
void
No *
No *
char
No::setEsq(No *p)
No::setDir(No *p)
No::setInfo(char c)
No::getEsq()
No::getDir()
No::getInfo()
{
{
{
{
{
{
esq = p; }
dir = p; }
info = c; }
return esq; }
return dir; }
return info; }
40 / 117
Arvores
Binarias
I
I
class ArvBin
{
public:
ArvBin();
ArvBin();
char
void
bool
void
bool
consultaRaiz();
cria(char c, ArvBin *sae, ArvBin *sad);
vazia();
imprime();
busca(char c);
private:
No * raiz;
};
41 / 117
Arvores
Binarias
ArvBin::ArvBin()
{
raiz = NULL;
}
char ArvBin::consultaRaiz()
{
if(raiz != NULL)
return raiz->getInfo();
else {
cout << "Erro: arvore vazia" << endl;
exit(1);
}
}
bool ArvBin::vazia()
{
return (raiz == NULL);
}
42 / 117
Arvores
Binarias
void ArvBin::cria(char c, ArvBin *sae, ArvBin *sad)
{
No * p = new No();
p->setInfo(c);
p->setEsq(sae->raiz);
p->setDir(sad->raiz);
raiz = p;
}
I
25
18
16
19
38
14
43 / 117
Arvores
Binarias
I
imprime(),
Antes de ver como implementar as operacoes
busca() e o destrutor da classe ArvBin, serao
apresentados os diferentes algoritmos de percurso em
a rvore.
44 / 117
Percurso em Arvores
Binarias
I
seus nos.
etc.
Por exemplo: imprimir, atualizar informacoes
45 / 117
Percurso em Arvores
Binarias
I
Visitar as subarvores de T.
sao
Questao: definir a ordem em que estas operacoes
realizadas de acordo com o problema.
46 / 117
Percurso em Arvores
Binarias
I
Envolve 3 tarefas:
I
I
I
V Visitar um no;
L Percorrer subarvore esquerda (left);
R Percorrer subarvore direita (right).
Percurso em pos-ordem
(ou pos-fixado):
LRV
47 / 117
Percurso pre-ordem
I
Visitar a raiz;
Percorrer sua subarvore esquerda, em pre-ordem;
Percorrer sua subarvore direita, em pre-ordem.
E
I
Ex: A, B, D, E, F, G, Y, C, H, I.
48 / 117
Percursos em ordem e pos-ordem
I
Em ordem (simetrica):
I
I
I
Pos-ordem:
I
I
I
49 / 117
Arvores
Binarias
I
void ArvBin::imprime()
{
auxImprime(raiz);
}
void ArvBin::auxImprime(No * p)
{
if(p != NULL)
{
cout << p->getInfo() << endl;
auxImprime( p->getEsq() );
auxImprime( p->getDir() );
}
}
50 / 117
Arvores
Binarias
I
class ArvBin
{
private:
No *raiz;
void auxImprime(No * p);
// etc ...
public:
// etc ...
};
I
imprimir o conteudo
da a rvore binaria.
51 / 117
Arvores
Binarias
void ArvBin::auxImprime(No * p) // em ordem
{
if(p != NULL)
{
auxImprime( p->getEsq() );
cout << p->getInfo() << endl;
auxImprime( p->getDir() );
}
}
52 / 117
Arvores
Binarias
bool ArvBin::busca(char ch)
{
return auxBusca(raiz, ch);
}
I
class ArvBin
{
private:
No *raiz;
bool auxBusca(No * p, char ch);
// etc ...
};
I
I
Arvores
Binarias
I
54 / 117
Arvores
Binarias
I
Destrutor.
ArvBin::ArvBin()
{
raiz = libera(raiz);
}
No* ArvBin::libera(No *p)
{
if (p != NULL)
{
p->setEsq( libera(p->getEsq()) );
p->setDir( libera(p->getDir()) );
delete p;
p = NULL;
}
return NULL;
}
55 / 117
Arvore
Binaria de Busca
68 / 117
Arvore
Binaria de Busca
I
da sub-arvore a`
maior do que as chaves de todos os nos
esquerda e
da sub-arvore a`
menor (ou igual) a` s chaves de todos os nos
direita.
69 / 117
Arvore
Binaria de Busca
I
I
I
I
busca
inserca o (*)
remoca o
70 / 117
TAD Arvore
Binaria de Busca
class ArvBinBusca
{
private:
No *raiz;
bool auxBusca(No * p);
public:
ArvBinBusca();
ArvBinBusca();
char
bool
bool
void
consultaRaiz();
vazia();
busca(int x);
remove(int x);
// outras operacoes
};
71 / 117
Busca na Arvore
Binaria
Revisao
72 / 117
Busca na Arvore
Binaria de Busca
I
I
I
Se igual, achou
Se menor, buscar na sub-arvore da esquerda
Se maior, buscar na sub-arvore da direita
73 / 117
TAD Arvore
Binaria de Busca
I
bool ArvBinBusca::busca(int x)
{
return auxBusca(raiz, x);
}
bool ArvBinBusca::auxBusca(No *p, int x)
{
if (p == NULL)
return false;
else if (p->consultaInfo() == x)
return true;
else if (x < p->consultaInfo())
return auxBusca(p->consultaEsq, x);
else // x > p->consultaInfo()
return auxBusca(p->consultaDir(), x);
}
74 / 117
Busca na Arvore
Binaria de Busca
I
30
13
10
25
15
11
12
14
33
18
75 / 117
Busca na Arvore
Binaria de Busca
I
30
13
10
25
15
11
12
14
33
18
76 / 117
Busca na Arvore
Binaria de Busca
I
I
I
realizados na
Complexidade: o numero
de comparacoes
busca e proporcional a` altura h da a rvore, isto e , O(h).
77 / 117
Arvore
Binaria de Busca
I
I
I
I
Nvel k 2k nos.
Melhor situaca o e quando a a rvore binaria e cheia
(balanceada):
Nvel 0
20 = 1
Nvel 1
21 = 2
Nvel 2
22 = 4
Nvel 3
23 = 8
78 / 117
Arvore
Binaria de Busca
I
N.
Neste caso a altura h e proporcional ao numero
de nos
20
20
13
11
10
13
11
10
81 / 117
Arvore
Binaria de Busca
I
em uma a rvore
Portanto, a complexidade das operacoes
binaria de busca e O(log2 N) na melhor situaca o
(balanceada) e O(N) na pior situaca o (degenerada), onde
da a rvore.
N e o numero
de nos
82 / 117
Arvore
Binaria de Busca
Inserca o
I
83 / 117
Arvore
Binaria de Busca
Inserca o
I
30
13
10
25
15
11
12
14
33
18
84 / 117
Arvore
Binaria de Busca
Inserca o
I
30
13
10
25
15
11
12
14
33
18
85 / 117
Arvore
Binaria de Busca
Inserca o
I
30
13
10
25
15
11
12
33
18
14
17
86 / 117
Arvore
Binaria de Busca
Inserca o
I
30
13
10
25
15
11
12
33
18
14
17
87 / 117
Arvore
Binaria de Busca
Inserca o
I
30
13
10
25
15
11
12
18
14
33
27
17
88 / 117
Arvore
Binaria de Busca
Exemplo
I
essas insercoes?
89 / 117
Arvore
Binaria de Busca
Exemplo
I
essas insercoes?
20
8
17
19
89 / 117
TAD Arvore
Binaria de Busca
Inserca o
class ArvBinBusca
{
private:
//...
No* auxInsere(No *p, int x);
//...
public:
//...
void insere(int x);
//...
};
I
A operaca o publica
tem a seguinte implementaca o
void ArvBinBusca::insere(int x)
{
raiz = auxInsere(raiz, x);
}
90 / 117
TAD Arvore
Binaria de Busca
Inserca o
91 / 117
Arvore
Binaria de Busca
Menor e maior
I
92 / 117
Arvore
Binaria de Busca
Menor e maior
int ArvBinBusca::min()
{
return auxMin(raiz);
}
int ArvBinBusca::auxMin(No *p)
{
if(p != NULL)
{
if(p->getEsq() == NULL)
return p->getInfo();
else
return auxMin( p->getEsq() );
}
}
93 / 117
Arvore
Binaria de Busca
Remoca o
I
um determinado no.
uma folha;
um no que possui apenas 1 filho;
ou um no que possui os 2 filhos.
94 / 117
Arvore
Binaria de Busca
void ArvBinBusca::removeMin()
{
raiz = auxRemoveMin(raiz);
}
No * ArvBinBusca::auxRemoveMin(No * p)
{
if(p != NULL)
{
if (p->getEsq() == NULL) {
No * r = p->getDir();
delete p;
return r;
}
p->setEsq( auxRemoveMin(p->getEsq()) );
return p;
}
}
95 / 117
Arvore
Binaria de Busca
Remoca o
I
das
Primeiro serao apresentadas as implementacoes
que removem o no de acordo com o caso em
funcoes
questao, isto e , removeFolha(), removeNo1Filho() e
removeNo2Filhos().
96 / 117
Arvore
Binaria de Busca
Remove no folha
I
I
I
No * ArvBinBusca::removeFolha(No * p)
{
delete p;
return NULL;
}
=
97 / 117
Arvore
Binaria de Busca
Remove no com 1 filho
I
15
11
17
20
11
20
14
19
17
19
98 / 117
Arvore
Binaria de Busca
Remove no com 1 filho
I
Arvore
Binaria de Busca
Remove no com 2 filhos
I
100 / 117
Arvore
Binaria de Busca
Remove no com 2 filhos
I
30
=
35
15
10
50
25
30
substituto
35
15
40
10
25
40
resultado
101 / 117
Arvore
Binaria de Busca
Remove no com 2 filhos
I
Arvore
Binaria de Busca
Remove no com 2 filhos
I
Exemplo: excluir o no 25
Passo 1/6
50
no a ser
excludo
25
60
35
15
10
25
30
55
65
40
103 / 117
Arvore
Binaria de Busca
Remove no com 2 filhos
I
Exemplo: excluir o no 25
Passo 2/6
50
25
60
35
15
10
25
30
55
65
40
104 / 117
Arvore
Binaria de Busca
Remove no com 2 filhos
I
Exemplo: excluir o no 25
Passo 3/6
50
25
60
35
15
10
25
30
55
65
40
substituto
105 / 117
Arvore
Binaria de Busca
Remove no com 2 filhos
I
I
Exemplo: excluir o no 25
Passo 4/6
50
30
60
35
15
10
25
25
55
65
40
troca com no a
ser excludo
106 / 117
Arvore
Binaria de Busca
Remove no com 2 filhos
I
I
Exemplo: excluir o no 25
Passo 5/6
50
30
60
35
15
10
25
25
55
65
40
remove no folha
107 / 117
Arvore
Binaria de Busca
Remove no com 2 filhos
I
Exemplo: excluir o no 25
Passo 6/6
50
situaca o
final
30
35
15
10
60
25
55
65
40
108 / 117
Arvore
Binaria de Busca
Remove no com 2 filhos
20
no a ser
excludo
30
10
8
6
25
17
9
33
18
14
substituto
16
109 / 117
Arvore
Binaria de Busca
Remove no com 2 filhos
20
30
14
8
6
25
17
9
16
33
18
situaca o final
110 / 117
Arvore
Binaria de Busca
Remoca o
void ArvBinBusca::remove(int x)
{
raiz = auxRemove(raiz, x);
}
I
Na classe ArvBinBusca
class ArvBinBusca {
private:
//...
No* auxRemove(No *p, int x);
// remove no
No* removeFolha(No *p);
// caso 1
No* remove1Filho(No *p);
// caso 2
No* menorSubArvDireita(No *p); // caso 3
//...
public:
//...
void remove(int x); // chama auxRemove
};
111 / 117
Arvore
Binaria de Busca
Remoca o
Arvore
Binaria de Busca
Remoca o
// continua ...
else
{
// p tem dois filhos
No *aux = menorSubArvDireita(p);
// troca as informacoes
int tmp = aux->getInfo();
p->setInfo(tmp);
tmp->setInfo(C);
// recursao: para a subarv. direita
p->setDir( auxRemove(p->getDir(),x) );
}
}
return p;
}
113 / 117
DINMICA
INTRODUO
RVORES
RVORE BINRIA
RVORE BINRIA DE
BUSCA
NO PRXIMO CAPTULO:
RVORE AVL