You are on page 1of 101

ALGORITMOS

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

Problema: determinar se um valor existe ou nao em um


vetor.

Os elementos sao pesquisados sucessivamente.

Comparaca o determina se o elemento foi encontrado ou


nao.

Exemplo: buscar 4 (vetor ou lista encadeada).

Tempo de busca: O(n).


4 / 117

Pesquisa sequencial
I

Se a pesquisa sequencial e executada em um vetor nao


ordenado, entao e necessario pesquisar em todo o vetor:

int busca(int v[], int tam, int chave)


{
int i = 0;
while (chave != v[i] && i < tam)
i = i + 1;
if (chave == v[i])
return i;
else
return -1;
}

5 / 117

Pesquisa sequencial
I

Pesquisa sequencial executada em um vetor ordenado:

int busca(int v[], int tam, int chave)


{
int i = 0;
while (chave > v[i] && i < tam)
i = i + 1;
if (chave == v[i])
return i;
else
return -1;
}

6 / 117

Pesquisa binaria
I

Pesquisa binaria em vetor ordenado (crescente):


int buscaBin(int v[], int tam, int chave)
{
int esq = 0, dir = tam - 1;
int pos = (esq + dir) / 2;
while (chave != v[pos] && esq <= dir) {
if (chave < v[pos])
dir = pos - 1;
else
esq = pos + 1;
pos = (esq + dir) / 2;
}
if (chave == v[pos])
return pos;
else
return -1;
}

Tempo de busca: O(log n)


7 / 117

Pesquisa binaria
I

Implementaca o recursiva da pesquisa binaria:

int buscaBin(int v[], int imin, int imax,


int chave)
{
if (imax < imin)
return -1;
else
{
int imed = (imin+max)/2;
if (v[imed] > chave)
return buscaBin(A, imin, imed-1, chave);
else if (v[imed] < chave)
return buscaBin(A, imed+1, imax, chave);
else
return imed;
}
}
8 / 117


Arvores

9 / 117

Motivaca o
I

Qual estrutura de dados um gerenciador de arquivos deve


utilizar?

10 / 117

Motivaca o
I

Hierarquia (ex: universidade)

11 / 117

Motivaca o
I

aritmeticas
Representaca o computacional de expressoes

12 / 117

Motivaca o
I

Listas ligadas
I
I
I

Sao mais flexveis do que vetores;


Possuem acesso sequencial;
Sao estruturas lineares sendo difcil utiliza-las para
organizar representaca o hierarquica de objetos.

Pilhas e filas
I
I

Refletem alguma hierarquia;


Mas sao limitadas a somente uma dimensao.

14 / 117


Arvores
I

Arvores
sao estruturas criadas para superar as limitacoes
de listas ligadas, pilhas e filas.

e de arcos.
Consiste de nos

Sao representadas com a raiz no topo e as folhas na base


(diferente de a rvore natural).

15 / 117


Graficas de Arvores
Representacoes
I

Hierarquica ou alinhamento dos nos.

16 / 117


Definicoes
I

Elemento que contem a informaca o


No:

Arco: Liga dois nos

Pai: no superior de um arco

Filho: no inferior de um arco


Raiz (no topo)

I
I

Nao possui ancestrais (nao tem no pai)


So pode ter filhos

Folhas
I
I

das extremidades inferiores


Nos
filhos (ou melhor, seus filhos sao estruturas
Nao tem nos
vazias)

18 / 117


Definicoes
raiz
20
pai

arco
no 13

30

25

15

11

33
filho

10

12

14

18

folhas

19 / 117


Definicoes
I

Definica o recursiva de a rvore


1. Uma estrutura vazia e uma a rvore vazia.
2. Se t1 . . ., tk sao razes de a rvores disjuntas, entao a estrutura
cuja raiz r tem como suas filhas as razes t1 . . ., tk tambem e
uma a rvore.
3. Somente estruturas geradas pelas regras 1 e 2 sao a rvores.

r
t1

t2

...

t3

tk

20 / 117


Definicoes
I

Grau de um no e o numero
de subarvores de um no.

Grau de uma a rvore (aridade): e definido como sendo


da a rvore.
igual ao grau maximo entre todos os nos

Cada no tem que ser atingvel a partir da raiz, atraves de

uma sequencia unica


de arcos chamada de caminho.

O comprimento do caminho e o numero


de arcos do
caminho.

Nvel de um no e a distancia (em arcos) entre o no e a raiz


da a rvore. A raiz tem nvel igual a 0.

21 / 117

Exemplo
a
c

d
g
I

Grau dos nos:


I
I

G(a)=2, G(b)=0, G(c)=3, G(d)=2,


G(e)=0, G(f)=1, G(g)=0, G(h)=0, G(i)=0.

Grau da a rvore: G(T)=3


22 / 117

Exemplo
I

Exemplo do caminho que vai do no a ate o no h.

O comprimento desse caminho e 3.

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

Altura de um no x e a distancia entre x e o seu descendente


mais afastado (folha). Mais precisamente, a altura de x e o

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

A a rvore vazia e uma a rvore de altura -1, por definica o.

Uma a rvore com um unico


no tem altura 0.
O no e raiz e folha ao mesmo tempo.

possui:
Toda a rvore com n > 1 nos
I
I

no mnimo 1 folha;
e no maximo n 1 folhas.

24 / 117

Exemplo
I

Quais os nveis e a altura da seguinte a rvore?


a
c

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

condica o sobre o numero


de filhos de um no:
I
I

Pode variar de 0 a qualquer inteiro;

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.

Em uma a rvore binaria cada filho e designado como filho a`


esquerda ou filho a` direita (ou no filho esquerdo e no filho
direito).

Exemplos:

30 / 117


Arvores
Binarias
I

Definica o: Uma a rvore binaria T e um conjunto finito de


ou vertices, tal que:
elementos denominados nos
I
I

se T = , a a rvore e dita vazia, ou

existe um no especial r, chamado raiz de T, e os nos


restantes podem ser divididos em dois subconjuntos
disjuntos, TrL e TrR , correspondentes a` s subarvores a
esquerda e a direita de r, respectivamente, que tambem sao
a rvores binarias.

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

subarvore de v e vazia, entao v se localiza no ultimo


(maior) nvel da a rvore. Neste caso, v e um no folha.
A

35 / 117


Arvores
Binarias
I

Propriedade: em uma a rvore binaria cheia, o numero


de
i
do nvel i e igual a 2 .
nos

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

TAD No para uma a rvore binaria de caracteres.

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

Implementaca o do TAD No para uma a rvore binaria de


caracteres.

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

Como representar a a rvore binaria?


Basta ter um ponteiro para a raiz da a rvore.

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

Como usar essa funca o para gerar a seguinte a rvore?


10

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.

Percurso corresponde a uma visita sistematica a cada um


da a rvore.
dos nos

basicas relativas a` manipulaca o


Esta e uma das operacoes
de a rvores.

Uma a rvore e essencialmente uma estrutura


nao-sequencial.

44 / 117


Percurso em Arvores
Binarias
I

Para percorrer a a rvore deve-se, entao, visitar cada um de

seus nos.

Visitar um no significa operar com a informaca o do no.

etc.
Por exemplo: imprimir, atualizar informacoes

Percorrer uma a rvore significa visitar os seus nos


exatamente uma vez.

Contudo, durante um percurso pode-se passar varias


sem visita-los.
vezes por alguns nos

45 / 117


Percurso em Arvores
Binarias
I

Passos basicos do percurso.

Visitar a raiz de cada subarvore de T.

Visitar as subarvores de T.

Percorrer as subarvores da esquerda e da direita da raiz.


que compoem

Logo, as tres operacoes


o algoritmo sao:

Visitar a raiz, percorrer a subarvore da esquerda e percorrer


a subarvore da direita.

sao
Questao: definir a ordem em que estas operacoes
realizadas de acordo com o problema.

46 / 117


Percurso em Arvores
Binarias
I

Algoritmo percurso em profundidade.


I
I
I
I

Seguir tanto quanto possvel a` esquerda (ou direita);


Entao mover para tras ate a primeira encruzilhada;
Seguir um passo para direita (ou esquerda);
Novamente, seguir tanto quanto possvel para a esquerda
(ou direita);
tenham sido
Repetir o processo ate que todos os nos
visitados.

Envolve 3 tarefas:
I
I
I

V Visitar um no;
L Percorrer subarvore esquerda (left);
R Percorrer subarvore direita (right).

3! possibilidades: VLR, LVR, LRV, VRL, RVL, RLV.

Percurso em pre-ordem (ou pre-fixado): VLR

Percurso em ordem simetrica (central ou em-ordem): LVR

Percurso em pos-ordem

(ou pos-fixado):
LRV
47 / 117

Percurso pre-ordem
I

Percurso em pre-ordem (pre-fixado)


I
I
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

Percorrer sua subarvore esquerda, em in-ordem;


Visitar a raiz;
Percorrer sua subarvore direita, em in-ordem.

Pos-ordem:
I
I
I

Percorrer sua subarvore esquerda, em in-ordem;


Percorrer sua subarvore direita, em in-ordem;
Visitar a raiz.

Observe a natureza recursiva dos algoritmos de percurso.

Exerccio: execute os percursos em ordem e pos-ordem


na
a rvore binaria do exemplo anterior. Qual a sequencia de

visita aos nos?

49 / 117


Arvores
Binarias
I

Agora, a funca o imprime do TAD ArvBin pode ser


implementada utilizando, por exemplo, um percurso
pre-ordem.

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

Mudancas na classe ArvBin:

class ArvBin
{
private:
No *raiz;
void auxImprime(No * p);
// etc ...
public:
// etc ...
};
I

A funca o auxImprime e que realiza toda a tarefa de

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() );
}
}

void ArvBin::auxImprime(No * p) // pos-ordem


{
if(p != NULL)
{
auxImprime( p->getEsq() );
auxImprime( p->getDir() );
cout << p->getInfo() << endl;
}
}

52 / 117


Arvores
Binarias
bool ArvBin::busca(char ch)
{
return auxBusca(raiz, ch);
}
I

Mudancas na classe ArvBin:

class ArvBin
{
private:
No *raiz;
bool auxBusca(No * p, char ch);
// etc ...
};
I
I

A funca o auxBusca e que realiza toda a tarefa de busca.


Como fica a implementaca o dessa funca o auxBusca?
53 / 117


Arvores
Binarias
I

A funca o busca procura a chave na a rvore seguindo um


percurso pre-ordem.

bool ArvBin::auxBusca(No *p, char ch)


{
if (p == NULL)
return false;
else if ( p->getInfo() == ch )
return true;
else if ( auxBusca(p->getEsq(),ch) )
return true;
else
return auxBusca(p->getDir(),ch);
}

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

Definica o: uma a rvore binaria de busca (ABB) e uma


a rvore binaria na qual cada no possui uma chave
comparavel e que satisfaz a seguinte restrica o: a chave em
qualquer no e
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

A representaca o de uma ABB e identica a` representaca o de


a rvores binarias (TAD ArvBin).

Portanto, a implementaca o deste TAD usa o mesmo TAD


No apresentado anteriormente.
precisam ser repensadas:
Entretanto, algumas operacoes

I
I
I

busca
inserca o (*)
remoca o

devem explorar a propriedade de


Essas operacoes
ordenaca o das ABBs.

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

Implementaca o da busca para Arvore


Binaria (!)

bool ArvBin::auxBusca(No *p, char C)


{
if (p == NULL)
return false;
else if (p->consultaInfo() == C)
return true;
else if (AuxBusca(p->consultaEsq(),C))
return true;
else
return AuxBusca(p->consultaDir(),C);
}

72 / 117


Busca na Arvore
Binaria de Busca

Como implementar essa operaca o para a Arvore


Binaria
de Busca?

Na ABB deve-se considerar a propriedade de ordenaca o


para realizar a busca de forma mais eficiente.
Ideia: compara-se o valor procurado com a informaca o do
no raiz:

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

Implementaca o da operaca o de busca

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

Exemplo do caminho percorrido para encontrar a chave 14.


20

30

13

10

25

15

11

12

14

33

18

75 / 117


Busca na Arvore
Binaria de Busca
I

Apresentar os caminhos percorridos para buscar as


seguintes chaves: 18, 11, 10, 25, 35, 7
20

30

13

10

25

15

11

12

14

33

18

76 / 117


Busca na Arvore
Binaria de Busca
I

I
I

O tempo de execuca o dos algoritmos em ABB depende da


forma das a rvores, que por sua vez, depende da ordem na
qual as chaves sao inseridas.

No melhor caso, tem-se uma a rvore de N nos


entre a raiz e as
perfeitamente balanceada com log2 N nos
folhas.
entre a raiz e
No pior caso, tem-se uma a rvore com N nos
as folhas.

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

Qual e a altura h de uma a rvore binaria com N nos?


Altura h = maior nvel.

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

Pior caso: a rvore binaria desbalanceada (degenerada).

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 resumo, sobre a complexidade na ABB:

realizadas nas operacoes


e
O numero
de comparacoes
proporcional a` altura h da a rvore: O(h).

A altura ABB e no mnimo log2 N e no maximo N.

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

Para inserir um novo no com valor y, deve-se percorrer a


a rvore buscando a chave y, ate o no que sera o seu pai, isto
e , o no que nao apresentar filho na sequencia natural do
percurso (ou filho = NULL).

Em seguida, basta incluir um no folha contendo y.

83 / 117


Arvore
Binaria de Busca
Inserca o
I

Exemplo: inserir os valores 17 e 27 na a rvore abaixo.


20

30

13

10

25

15

11

12

14

33

18

84 / 117


Arvore
Binaria de Busca
Inserca o
I

Exemplo: inserir o valor 17


20

30

13

10

25

15

11

12

14

33

18

85 / 117


Arvore
Binaria de Busca
Inserca o
I

Exemplo: inserir o valor 17


20

30

13

10

25

15

11

12

33

18

14

17
86 / 117


Arvore
Binaria de Busca
Inserca o
I

Em seguida, inserir o valor 27


20

30

13

10

25

15

11

12

33

18

14

17
87 / 117


Arvore
Binaria de Busca
Inserca o
I

Em seguida, inserir o valor 27


20

30

13

10

25

15

11

12

18

14

33

27

17
88 / 117


Arvore
Binaria de Busca
Exemplo
I

Considere uma ABB inicialmente vazia.

Inserir as chaves 15, 6, 20, 17, 8, 4 e 19

essas insercoes?

Qual o resultado apos

89 / 117


Arvore
Binaria de Busca
Exemplo
I

Considere uma ABB inicialmente vazia.

Inserir as chaves 15, 6, 20, 17, 8, 4 e 19

essas insercoes?

Qual o resultado apos


15
6
4

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

No* ArvBinBusca::auxInsere(No *p, int x)


{
if(p == NULL)
{
p = new No();
p->setInfo(x);
p->setEsq(NULL);
p->setDir(NULL);
}
else if(x < p->getInfo())
p->setEsq( auxInsere(p->getEsq(), x) );
else
p->setDir( auxInsere(p->getDir(), x) );
return p;
}

91 / 117


Arvore
Binaria de Busca
Menor e maior
I

Pode-se implementar a busca pelo menor (maior) de forma


recursiva ou iterativa.

Descrica o recursiva para encontrar o menor:


I

Se a sub-arvore a` esquerda da raiz e vazia, entao o menor


esta na raiz.
Se a sub-arvore a` esquerda da raiz nao e vazia, entao o
menor esta na sub-arvore a` esquerda.

Para encontrar o maior valor, basta trocar esquerda por


direita na descrica o acima.

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

A operaca o mais complicada em uma ABB e a de remover

um determinado no.

Quando deseja-se remover um no qualquer da a rvore, este


no pode ser:
I
I
I

uma folha;
um no que possui apenas 1 filho;
ou um no que possui os 2 filhos.

Antes de estudar o caso mais geral, considere o caso de


remover o menor valor da ABB.

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

Para remover um no qualquer da a rvore, serao criadas 3


para tratar de cada um dos casos mencionados.
funcoes

Ideia geral para remover um no com a chave x:

se a a rvore e vazia, retorna NULL

senao se x < p->consultaInfo(), remove x na SAE

senao se x > p->consultaInfo(), remove x na SAD

senao se o no e folha, entao removeFolha()

senao se o no possui apenas 1 filho, entao


removeNo1Filho()

senao (o no possui 2 filhos), removeNo2Filhos()

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

A funca o removeFolha(No * p) recebe um ponteiro


para um no que e uma folha e entao remove o no da
a rvore.
O ponteiro do pai e ajustado para NULL e o no e removido.
E preciso ter certeza de que p aponta para um no folha.

No * ArvBinBusca::removeFolha(No * p)
{
delete p;
return NULL;
}

=
97 / 117


Arvore
Binaria de Busca
Remove no com 1 filho
I

Ponteiro do pai do no a ser removido e reajustado para


apontar para o filho do no a ser removido.

Ou seja, o pai vai apontar para o neto(que passa a ser


filho).

Desse modo, descendentes do no em questao sao elevados


em 1 nvel.

Exemplo: remover o no 14.


15

15

11

17

20

11

20

14

19

17

19

98 / 117


Arvore
Binaria de Busca
Remove no com 1 filho
I

A funca o removeNo1Filho() e usada para um remover

um no p que so possua um unico


filho.
E preciso ter certeza de que p so possui um filho para usar
essa funca o.

No* ArvBinBusca::removeNo1Filho(No *p)


{
No *aux;
if(p->getEsq() == NULL)
aux = p->getDir();
else
aux = p->getEsq();
delete p;
return aux;
}
99 / 117


Arvore
Binaria de Busca
Remove no com 2 filhos
I

Se o no a ser removido tem 2 filhos:


I
I

Remover fazendo copia.

Remover fazendo junca o (merge). Nao sera visto.

Remoca o por copia


(Thomas Hibbard e Donald Knuth):
substituir o no a ser removido pelo menor no de sua
sub-arvore a` direita e ajustar ponteiros.

Etapas da remoca o por copia:


1. Buscar substituto (menor no da sua sub-arvore a` direita).
2. Trocar a informaca o do no a ser removido com a do
substituto.
3. Remover o substituto (essa remoca o faz o ajuste dos
ponteiros).

100 / 117


Arvore
Binaria de Busca
Remove no com 2 filhos
I

Exemplo: excluir o no 25.


50
25

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

Para remover um no com 2 filhos, uma funca o auxiliar


para encontrar o menor elemento da sub-arvore da direita
ou substituto (no mais a` esquerda da sub-arvore da direita)
sera implementada.

Dado um ponteiro para um no qualquer p, a funca o


menorSubArvDireita(p) retorna o menor elemento de
sua sub-arvore da direita, se existir.

So pode ser chamada para um no p com 2 filhos.

No* ArvBinBusca::menorSubArvDireita(No *p)


{
No *aux = p->getDir();
while(aux->getEsq() != NULL)
aux = aux->getEsq();
return aux;
}
102 / 117


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

Outro exemplo: excluir o no 10

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

Outro exemplo: excluir o no 10

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

No* ArvBinBusca::auxRemove(No *p, int x)


{
if(p == NULL)
return NULL;
else if(x < p->getInfo())
p->setEsq( auxRemove(p->getEsq(), x) );
else if(x > p->consultaInfo())
p->setDir( auxRemove(p->getDir(), x) );
else // achou o no a ser removido
{
if((p->getEsq() == NULL) &&
(p->getDir() == NULL))
p = removeFolha(p);
else if((p->getEsq() == NULL) ||
(p->getDir() == NULL))
p = remove1Filho(p);
else
// continua ...
112 / 117


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

NESTE CAPTULO, VIMOS:


1.
2.
3.
4.
5.

DINMICA
INTRODUO
RVORES
RVORE BINRIA
RVORE BINRIA DE
BUSCA

NO PRXIMO CAPTULO:
RVORE AVL

Definies, como funciona, como


o algoritmo.

You might also like