Você está na página 1de 27

rvore Binria de Busca

319

rvore Binria de Busca


!

construda de tal forma que, para cada n:


! ns com chaves menores esto na sub-rvore
esquerda
! ns com chaves maiores (ou iguais) esto na subrvore direita
a insero dos ns da rvore deve satisfazer a essa
propriedade

320

rvore Binria de Busca


!

para a busca de uma chave v na rvore binria


de busca:
! primeiro compare com a raiz
!
!

se menor, v para a sub- rvore esquerda


se maior, para a sub-rvore direita

aplique o mtodo recursivamente

321

rvore Binria de Busca


6
4
3

9
5

10

Buscando a chave 9
322

rvore Binria de Busca


!

a cada passo, garante-se que nenhuma outra


parte da rvore contm a chave sendo
buscada
o procedimento pra quando
!
!

o n com v encontrado
seno, chega-se a NULL

323

rvore Binria de Busca


chama a funo de busca se a rvore no vazia
busca_arvore_nao_recursivo (v, pt)
{
???
}

324

rvore Binria de Busca


busca_arvore_nao_recursivo (v, pt)
{
do {
if (v < pt->info)
pt = pt-> esq;
else pt = pt-> dir;
}while (pt != NULL) && (v != pt->info);
return(pt);
}
325

Inserindo em rvore Binria de Busca


!

Para inserir um n na rvore:


!
!
!

fazer uma busca com insucesso


alocar um novo n
necessrio saber por qual n se chegou a NULL
! ser o pai do novo n

326

Inserindo em rvore Binria de Busca


6
4
3

9
5

10

Inserindo o 9

327

Inserindo em rvore Binria de Busca


6
4
3

9
5

10

7
2

Inserindo o 7

328

Insero rvore Binria de Busca


insere_rvore (int valor, tipo_n * pt)
{

329

Insero rvore Binria de Busca


insere_rvore (int valor, tipo_n * pt)
{ tipo_n * pai;
do{ pai = pt ;
if (valor < pt->chave) pt = pt ->esq ;
else if ( valor > pt-> chave) pt = pt->dir;
} while(pt != NULL) && (pt->chave != valor);
if (pt == NULL){
pt = aloca();
pt ->chave = valor; pt->esq = NULL; pt->dir = NULL;
if (v < pai->chave) pai ->esq = pt ;
else pai ->dir = pt ;
return(pt);

}
}
330

Insero rvore Binria de Busca


!

a rvore est classificada se percorrida da forma


correta (pre, pos ou em-ordem?)
! as chaves aparecem em ordem se lidas da
esquerda para a direita
podemos ordenar uma sequncia como se fosse uma
srie de inseres
! o programa tem apenas os ponteiros para se
preocupar
! qual a diferena
331

Remoo em rvore Binria de Busca


!

at ento, vimos que a implementao da


operao de insero simples
a remoo de um elemento j mais complexa
!

remoo de um n folha
!

se possui apenas um filho


!

os ponteiros esquerdo e direito do pai so setados para NULL


o ponteiro apropriado do pai passa a apontar para o filho

se o n possui dois filhos


!

se um desses dois filhos no possui filhos, use esse n para


substituir o n removido

332

Remoo em rvore Binria de Busca


!

seno: substituir o valor do n a ser removido

substitua este com o elemento cuja chave


imediatamente maior (ou menor)
! sempre folha?
seno for folha v repetindo o procedimento

algoritmo?

333

Remoo em rvore Binria de Busca


6
4
3

9
5

10

7
2

Removendo 5:
! basta que o ponteiro a direita de 4 aponte para
NULL
334

Remoo em rvore Binria de Busca


6
4
3

9
5

10

7
2 !

Removendo 3:
!
!

basta que substituir o n 3 pelo n 2


continua valendo a regra de formao da rvore
335

Remoo em rvore Binria de Busca


6
9

4-5
3

10

7
2 !

Removendo 4:
!
!

basta que o substituir 4 pelo 5


continua valendo a regra de formao da rvore
336

Remoo em rvore Binria de Busca


6 - 7
4
3

9
5

10

7
2

Removendo 6 (raiz):
! substituir o 6 pelo imediatamente maior: 7 como
determinar?
! resulta na remoo do elemento de chave 7
337

Remoo em rvore Binria de Busca


remove_ABB (int valor, tipo_n * pt)
{ tipo_n * pai;
/* a busca */
do{ pai = pt ;
if (valor < pt->chave) pt = pt ->esq ;
else if ( valor > pt-> chave) pt = pt->dir;
} while(pt != NULL) && (pt->chave != valor);
if (pt != NULL){ /* ok, encontrou o valor na ABB */

338

Remoo em rvore Binria de Busca


if (pt != NULL){ /* ok, encontrou o valor na ABB */
/* se um n interno com duas subrvores vazias */
if (p-> esq != NULL) && (pt->dir != NULL){
ptaux = pt;
pai = pt; pt = pt->dir;
while (pt->esq != NULL) { /* acha o imediatamente maior */
pai = pt;
pt = pt->esq;
}
/* troca o valor do n a ser retirado pelo imediatamente maior */
ptaux->valor = pt->valor;
}

339

Remoo em rvore Binria de Busca


if (pt != NULL){ /* ok, encontrou o valor na ABB */
/* se um n interno com duas subrvores vazias */
.......
if (pt->esq != NULL) && (pt-> dir == NULL){
/* s tem o filho esq */
if (pai->esq ==pt) pai->esq = pt->esq;
else pai->dir = pt->esq;
} else if (pt->esq == NULL) && (pt-> dir != NULL){
/* s tem o filho direito */
if (pai->esq ==pt) pai->esq = pt->dir;
else pai->dir = pt->dir;
} else{/* ento folha */
if (pai->esq ==pt) pai->esq = NULL;
else pai->dir = NULL;
}
free (pt);
}

340

rvore Binria de Busca


!

A rvore obtida depende da seqncia de


insero de ns
Para que a rvore binria de busca seja
completa
!
!
!
!

completa tem altura mnima


o conjunto das chaves deve ser reordenado
rvore comum - O (n)
rvore completa - O (log n)

341

rvore Binria de Busca


!

uma rvore binria de busca completa


!
!
!

o conjunto das chaves deve ser re-ordenado


sejam so e s n+1 duas chaves fictcias e j inseridas
a cada passo inserir em T uma nova chave que seja
de ndice mdio entre i e j - duas chaves j inseridas

342

rvore Binria de Busca


!

rvore completa: tima para a busca


!

quando a freqncia de acesso aos ns igual

normalmente estas freqncias so diferentes


interessante construir uma rvore binria que
seja a melhor possvel no que diz respeito
busca para freqncias conhecidas
343

Eficincia da rvore de Busca


!
!

!
!

Depende da ordem original dos dados


Se o array original est ordenado (ascendente ou
descendente), as rvores resultantes s tem filhos a
direita ou a esquerda
! a insero do 1o. n - 0 comparaes
! a insero do 2o. n - 2 comparaes
! a insero do 3o. n - 3 comparaes
2 + 3 +....+n = n*(n+1)/2 -1
Complexidade - O(n2) - para inserir n ns
344

Eficincia da rvore de Busca


!

Se a lista original estiver organizada, e se


uma rvore completa (parecida com
completa) for se formando:
!

complexidade da insero = O( n log n )

345