Estruturas de Dados 2005/2006
62
Propriedades de Árvores Binárias
Propriedade 1:Uma árvore binária com N nós internos tem, no máximo, N+1 folhas
Demonstração: (Indução Matemática no número de nós)
N=0 : Trivial!
N = m : Hipótese de indução – Uma árvore binária com m nós internos tem, no
máximo, m + 1 folhas
N > 0 : Uma árvore binária, T , com N nós internos terá k deles na sub–árvore esquerda
(0 ≤ k ≤ N − 1) e N − k − 1 na sub–árvore direita.
Usando a hipótese de indução, a sub–árvore esquerda possui 0 ≤ ne ≤ k + 1 folhas e a
sub–árvore direita possui 0 ≤ nd ≤ N − k.
Assim, temos, para o número de folhas de T ,
nt = ne + nd ⇐⇒ 0 ≤ nt ≤ (k + 1) + (N − k) ⇐⇒ 0 ≤ nt ≤ N + 1
Estruturas de Dados 2005/2006
63
Propriedades de Árvores Binárias – Cont.
Propriedade 2: Uma árvore binária completa de altura h tem, exactamente, 2h+1 − 1 nós
Demonstração: (Indução Matemática na altura)
Propriedade 3: O número máximo de nós de uma árvore binária de altura h é 2h+1 − 1.
Demonstração: 1 + 2 + 22 + . . . + 2h = 2h+1 − 1
q.e.d.
Estruturas de Dados 2005/2006
64
Propriedades de Árvores Binárias – Cont. da cont.
Qual a altura mı́nima de uma árvore binária com N nós?
Seja h t.q. N ≤ 2h+1 − 1
1. Nenhuma árvore binária com altura inferior a h pode ter N nós.
2. Existe uma árvore binária de altura h com, exactamente, N nós.
3. Logo, h assim definido é a altura mı́nima para uma árvore binária possuir N nós:
N ≤ 2h+1 − 1 =⇒ h ≥ log2 (N + 1) − 1
Propriedade 4:
A altura mı́nima para uma árvore binária com N nós é blog2 (N + 1)c
Estruturas de Dados 2005/2006
65
Árvores Binárias de Pesquisa
#ifndef _SearchBTree_h
#define _SearchBTree_h
typedef struct elemSBT{
Item valor;
struct elemSTB *fesq, *fdir;
} ElemArvP, *ArvPesq;
ArvPesq criar();
ArvPesq procura(Item X, ArvPesq T);
ArvPesq minimo(ArvPesq T);
ArvPesq maximo(ArvPesq T);
void
inserir(Item val, ArvPesq *T);
void
remover(Item val, ArvPesq *T);
Item
consulta(ArvPesq T);
#endif
Estruturas de Dados 2005/2006
Árvores Binárias de Pesquisa – continuação
ArvPesq criar()
{/* Cria uma arv. de pesq. vazia */
return NULL;
}
int vazia(ArvPesq T)
{/* devolve True(1) sse T e’ vazia */
return T ? 0 : 1;
}
ArvPesq procura(Item X, ArvPesq T)
{/* procura em T vertice com X */
if( vazia(T) )
return NULL;
if( X < T->valor)
return procura(X, T->fesq);
if( X > T->valor)
return procura(X, T->fdir);
else return T;
}
66
Estruturas de Dados 2005/2006
Árvores Binárias de Pesquisa – parte III
ArvPesq minimo(ArvPesq T)
{/* procura o vertice com valor minimo */
if( vazia(T) )
return NULL;
else if( vazia(T->fesq) )
return T;
else return minimo(T->fesq);
}
ArvPesq maximo(ArvPesq T)
{/* procura o vertice com valor maximo */
if( !vazia(T) )
while( !vazia(T->fdir) )
T = T->fdir;
return T;
}
67
Estruturas de Dados 2005/2006
Árvores Binárias de Pesquisa – Inserir
void inserir(Item val, ArvPesq *T);
{/* insere o vertice com valor val (se nao existir) */
if( vazia(*T) )
*T = novo_no(val); // novo no’ com valor val e ponts nulos
else if( val < (*T)->valor )
inserir(val, &(*T)->fesq);
else if( val > (*T)->valor )
inserir(val, &(*T)->fdir);
// senao val ja’ existe em T
}
68
Estruturas de Dados 2005/2006
69
Árvores Binárias de Pesquisa – Remover
void remover(Item val, ArvPesq *T);
{ ArvPesq aux, minimo();
Item consulta();
/* remove o vertice com valor val */
if(!vazia(*T))
if(val < (*T)->valor)
remover(val, &((*T)->fesq));
else if(val > (*T)->valor)
remover(val, &((*T)->fdir));
else
// encontrou
if( !vazia((*T)->fesq) && !vazia((*T)->fdir) )
{
aux = minimo((*T)->fdir);
(*T)->valor = consulta(aux);
remover((*T)->valor, (*T)->fdir);
}
else{
aux = *T;
if(vazia((*T)->fesq))
*T = (*T)->fdir;
else *T = (*T)->fesq;
Libertar(aux);
}
}
Download

Exemplos Árvores binárias e de Pesquisa