Buscar

04-ArvoresBinariasBusca

Prévia do material em texto

ÁRVORES BINÁRIAS DE BUSCA Vanessa BraganholoEstruturas de Dados e Seus 
Algoritmos 
REFERÊNCIA
Szwarcfiter, J.; Markezon, L. Estruturas de Dados e seus Algoritmos, 3a. ed. 
LTC. Cap. 4
INSTITUTO DE COMPUTAÇÃO - UFF 2
BUSCA
Diversas aplicações precisam buscar um determinado valor em um conjunto de dados
Essa busca deve ser feita da forma mais eficiente possível 
Árvores binárias possibilitam buscas com eficiência
Exemplo: buscar dados de uma pessoa que possui um determinado CPF
Dados das pessoas são armazenados numa árvore binária de busca 
CPF funciona como “chave”, pois é único para cada pessoa (não existem duas 
pessoas com o mesmo CPF)
INSTITUTO DE COMPUTAÇÃO - UFF 3
ÁRVORES BINÁRIAS DE BUSCA 
Apresentam uma relação de ordem entre os nós
Ordem é definida pela chave
esq chave info dir
Demais infos do nó
INSTITUTO DE COMPUTAÇÃO - UFF 4
ÁRVORES BINÁRIAS DE BUSCA
Uma árvore binária T é uma árvore 
binária de busca se: 
­ Chaves da subárvore esquerda de T são 
menores do que chave da raiz de T; e
­ Chaves da subárvore da direita de T são 
maiores do que a chave da raiz de T; e
­ Subárvores da esquerda e da direita de T são 
árvores binárias de busca
raiz500
300 800
150 400 900600
INSTITUTO DE COMPUTAÇÃO - UFF 5
ÁRVORES BINÁRIAS DE BUSCA
Para um mesmo conjunto de chaves, 
existem várias árvores binárias de busca 
possíveis 
Exemplos para o conjunto de chaves: 
{1, 2, 3, 4, 5, 6, 7} 
INSTITUTO DE COMPUTAÇÃO - UFF 6
3
1 7
2 5
4 6
2
1 7
3
4
5
6
OPERAÇÕES
Buscar nó com determinada chave
Inserir novo nó
Remover nó
raiz500
300 800
150 400 900600
Operações devem preservar a 
ordem entre os nós! 
INSTITUTO DE COMPUTAÇÃO - UFF 7
BUSCA POR NÓ COM CHAVE X
raiz500
300 800
150 400 900600
INSTITUTO DE COMPUTAÇÃO - UFF 8
Em qualquer nó: 
X = Chave
X > Chave
X < Chave
EXEMPLO: BUSCAR POR 600
raiz500
300 800
150 400 900600
INSTITUTO DE COMPUTAÇÃO - UFF 9
EXEMPLO: BUSCAR POR 600
600 > 500 
Ir para direita 
INSTITUTO DE COMPUTAÇÃO - UFF 10
raiz500
300 800
150 400 900600
EXEMPLO: BUSCAR POR 600
600 < 800
Ir para a esquerda 
INSTITUTO DE COMPUTAÇÃO - UFF 11
raiz500
300 800
150 400 900600
EXEMPLO: BUSCAR POR 600
600 = 600
Achou
INSTITUTO DE COMPUTAÇÃO - UFF 12
raiz500
300 800
150 400 900600
EXEMPLO: BUSCAR POR 200
200 < 500
Ir para esquerda
200 < 300
Ir para esquerda
200 > 150 
Ir para a direita
NULL: chave não encontrada
INSTITUTO DE COMPUTAÇÃO - UFF 13
raiz500
300 800
150 400 900600
BUSCA POR NÓ COM DETERMINADA CHAVE
esq chave info dir/* representação dos nós de a */ 
typedef struct sNoA {
char info;
int chave;
struct sNoA* esq;
struct sNoA* dir;
} TNoA;
TNoA* busca(TNoA *no, int chave) {
//Recebe endereço da raiz e chave procurada. 
Se encontrar, retorna ponteiro p/ nó 
encontrado. 
//Caso contrário, retorna NULO
}
Fazer agora!
INSTITUTO DE COMPUTAÇÃO - UFF 14
IMPLEMENTAÇÃO ITERATIVA
TNoA* busca(TNoA *no, int chave) {
TNoA *aux = no;
while (aux != NULL) {
if (aux->chave == chave )
return aux; //achou retorna o ponteiro para o nó
else
if (aux->chave > chave)
aux = aux->esq;
else
aux = aux->dir;
}
return NULL; //não achou, retorna null
}
INSTITUTO DE COMPUTAÇÃO - UFF 15
IMPLEMENTAÇÃO RECURSIVA
TNoA* buscaRecursiva(TNoA *no, int chave) {
if (no == NULL)
return NULL;
else if (no->chave == chave)
return no;
else if (no->chave > chave)
return buscaRecursiva(no->esq, chave);
else
return buscaRecursiva(no->dir, chave);
}
INSTITUTO DE COMPUTAÇÃO - UFF 16
COMPLEXIDADE
Em cada chamada da função busca, é efetuado um número constante de operações.
A complexidade da busca é igual ao número de chamadas da função. 
No pior caso (quando chave buscada está na folha), a complexidade é a altura da 
árvore.
Complexidade mínima de pior caso ocorre para árvore completa, onde altura é log 
n (n é o número de nós da árvore). 
Portanto, o ideal é que a árvore binária de busca seja o mais balanceada possível.
INSTITUTO DE COMPUTAÇÃO - UFF 17
INSERÇÃO
Se a árvore for vazia, instala o novo nó na raiz
Se não for vazia, compara a chave com a chave da raiz:
­ se for menor, instala o nó na sub-árvore da esquerda
­ caso contrário, instala o nó na sub-árvore da direita
IMPORTANTE: nó é sempre inserido como uma folha
INSTITUTO DE COMPUTAÇÃO - UFF 18
INSERÇÃO
Se a árvore for vazia, instala o novo nó na raiz
Se não for vazia, compara a chave com a chave da raiz:
­ se for menor, instala o nó na sub-árvore da esquerda
­ caso contrário, instala o nó na sub-árvore da direita
INSTITUTO DE COMPUTAÇÃO - UFF 19
Ordem de Inserção: 
500 – 800 – 300 - 400
500
INSERÇÃO
Se a árvore for vazia, instala o novo nó na raiz
Se não for vazia, compara a chave com a chave da raiz:
­ se for menor, instala o nó na sub-árvore da esquerda
­ caso contrário, instala o nó na sub-árvore da direita
INSTITUTO DE COMPUTAÇÃO - UFF 20
Ordem de Inserção: 
500 – 800 – 300 - 400
500
800
INSERÇÃO
Se a árvore for vazia, instala o novo nó na raiz
Se não for vazia, compara a chave com a chave da raiz:
­ se for menor, instala o nó na sub-árvore da esquerda
­ caso contrário, instala o nó na sub-árvore da direita
INSTITUTO DE COMPUTAÇÃO - UFF 21
Ordem de Inserção: 
500 – 800 – 300 - 400
500
300 800
INSERÇÃO
Se a árvore for vazia, instala o novo nó na raiz
Se não for vazia, compara a chave com a chave da raiz:
­ se for menor, instala o nó na sub-árvore da esquerda
­ caso contrário, instala o nó na sub-árvore da direita
500
300 800
INSTITUTO DE COMPUTAÇÃO - UFF 22
Ordem de Inserção: 
500 – 800 – 300 - 400
400
+ 380
500
300 800
150 400 900600
raizEXEMPLO
INSTITUTO DE COMPUTAÇÃO - UFF 23
+ 380
500
300 800
150 400 900600
raiz
380
EXEMPLO
INSTITUTO DE COMPUTAÇÃO - UFF 24
+ 380
+ 750
500
300 800
150 400 900600
raiz
380
EXEMPLO
INSTITUTO DE COMPUTAÇÃO - UFF 25
+ 380
+ 750
500
300 800
150 400 900600
raiz
380 750
EXEMPLO
INSTITUTO DE COMPUTAÇÃO - UFF 26
EXERCÍCIOS
1. Inserir em uma ABB inicialmente vazia, os seguintes valores:
25, 22, 40, 30, 45, 27, 20, 21, 48 
2. Inserir em uma ABB inicialmente vazia, os seguintes valores: 
40, 25, 20, 30, 45, 27, 22, 21, 48
INSTITUTO DE COMPUTAÇÃO - UFF 27
INSERÇÃO
25 22 40 30 45 27 20 21 48
22
25
40
20 30 45
21 27 48
40 25 20 30 45 27 22 21 48
25
40
45
20 30
21
22
48
27
INSTITUTO DE COMPUTAÇÃO - UFF 28
INSERÇÃO
25 22 40 30 45 27 20 21 48
A árvore gerada depende da ordem 
de inserção dos nós
22
25
40
20 30 45
21 27 48
40 25 20 30 45 27 22 21 48
25
40
45
20 30
21
22
48
27
INSTITUTO DE COMPUTAÇÃO - UFF 29
IMPLEMENTAÇÃO DE INSERÇÃO
TNoA *insere(TNoA *no, int chave) {
if (no == NULL) {
no = (TNoA *) malloc(sizeof(TNoA));
no->chave = chave;
no->esq = NULL;
no->dir = NULL;
} else if (chave < (no->chave))
no->esq = insere(no->esq, chave);
else if (chave > (no->chave)) 
no->dir = insere(no->dir, chave);
else {
printf("Inserção inválida! "); // chave já existe
exit(1);
}
return no;
}
INSTITUTO DE COMPUTAÇÃO - UFF 30
IMPLEMENTAÇÃO DE INSERÇÃO
TNoA *insere(TNoA *no, int chave) {
if (no == NULL) {
no = (TNoA *) malloc(sizeof(TNoA));
no->chave = chave;
no->esq = NULL;
no->dir = NULL;
} else if (chave < (no->chave))
no->esq = insere(no->esq, chave);
else if (chave > (no->chave)) 
no->dir = insere(no->dir, chave);
else {
printf("Inserção inválida! "); // chave já existe
exit(1);
}
return no;
}
INSTITUTO DE COMPUTAÇÃO - UFF 31
Árvore Binária de Busca não 
pode ter chave duplicada
PROBLEMA
A ordem em que as chaves são inseridas numa árvore de busca binária pode fazer 
com que uma árvore se deteriore, ficando com altura muito grande. 
Exemplo: 
INSTITUTO DE COMPUTAÇÃO - UFF 32
25 40 39 27 
25
40
39
27
CRIAÇÃO DE ÁRVORE BINÁRIA DE BUSCA MAIS 
BALANCEADA POSSÍVEL
Sabendo disso, é possível reordenar as chaves de entrada de forma a obter uma 
árvore o mais balanceada possível. 
Algoritmo: 
­ Seja v um vetor ORDENADO contendoas chaves a serem inseridas 
­ Inserir a chave do meio
­ Chamar recursivamente para os dois pedaços que sobraram
INSTITUTO DE COMPUTAÇÃO - UFF 33
CRIAÇÃO DE ÁRVORE BINÁRIA DE BUSCA MAIS 
BALANCEADA POSSÍVEL
Algoritmo: 
­ Seja v um vetor ORDENADO contendo as 
chaves a serem inseridas 
­ Inserir a chave do meio
­ Chamar recursivamente para os dois pedaços 
que sobraram (esquerda e direita)
INSTITUTO DE COMPUTAÇÃO - UFF 34
150 300 400 500 600 800 900
500
CRIAÇÃO DE ÁRVORE BINÁRIA DE BUSCA MAIS 
BALANCEADA POSSÍVEL
Algoritmo: 
­ Seja v um vetor ORDENADO contendo as 
chaves a serem inseridas 
­ Inserir a chave do meio
­ Chamar recursivamente para os dois pedaços 
que sobraram (esquerda e direita)
INSTITUTO DE COMPUTAÇÃO - UFF 35
150 300 400 500 600 800 900
500
CRIAÇÃO DE ÁRVORE BINÁRIA DE BUSCA MAIS 
BALANCEADA POSSÍVEL
Algoritmo: 
­ Seja v um vetor ORDENADO contendo as 
chaves a serem inseridas 
­ Inserir a chave do meio
­ Chamar recursivamente para os dois pedaços 
que sobraram (esquerda e direita)
INSTITUTO DE COMPUTAÇÃO - UFF 36
150 300 400 500 600 800 900
500
300
CRIAÇÃO DE ÁRVORE BINÁRIA DE BUSCA MAIS 
BALANCEADA POSSÍVEL
Algoritmo: 
­ Seja v um vetor ORDENADO contendo as 
chaves a serem inseridas 
­ Inserir a chave do meio
­ Chamar recursivamente para os dois pedaços 
que sobraram (esquerda e direita)
INSTITUTO DE COMPUTAÇÃO - UFF 37
150 300 400 500 600 800 900
500
300
150
CRIAÇÃO DE ÁRVORE BINÁRIA DE BUSCA MAIS 
BALANCEADA POSSÍVEL
Algoritmo: 
­ Seja v um vetor ORDENADO contendo as 
chaves a serem inseridas 
­ Inserir a chave do meio
­ Chamar recursivamente para os dois pedaços 
que sobraram (esquerda e direita)
INSTITUTO DE COMPUTAÇÃO - UFF 38
150 300 400 500 600 800 900
500
300
150 400
CRIAÇÃO DE ÁRVORE BINÁRIA DE BUSCA MAIS 
BALANCEADA POSSÍVEL
Algoritmo: 
­ Seja v um vetor ORDENADO contendo as 
chaves a serem inseridas 
­ Inserir a chave do meio
­ Chamar recursivamente para os dois pedaços 
que sobraram (esquerda e direita)
INSTITUTO DE COMPUTAÇÃO - UFF 39
150 300 400 500 600 800 900
500
300
150 400
800
CRIAÇÃO DE ÁRVORE BINÁRIA DE BUSCA MAIS 
BALANCEADA POSSÍVEL
Algoritmo: 
­ Seja v um vetor ORDENADO contendo as 
chaves a serem inseridas 
­ Inserir a chave do meio
­ Chamar recursivamente para os dois pedaços 
que sobraram (esquerda e direita)
INSTITUTO DE COMPUTAÇÃO - UFF 40
150 300 400 500 600 800 900
500
300
150 400
800
600
CRIAÇÃO DE ÁRVORE BINÁRIA DE BUSCA MAIS 
BALANCEADA POSSÍVEL
Algoritmo: 
­ Seja v um vetor ORDENADO contendo as 
chaves a serem inseridas 
­ Inserir a chave do meio
­ Chamar recursivamente para os dois pedaços 
que sobraram (esquerda e direita)
INSTITUTO DE COMPUTAÇÃO - UFF 41
150 300 400 500 600 800 900
500
300
150 400
800
600 900
CRIAÇÃO DE ÁRVORE BINÁRIA DE BUSCA MAIS 
BALANCEADA POSSÍVEL
Algoritmo: 
­ Seja v um vetor ORDENADO contendo as 
chaves a serem inseridas 
­ Inserir a chave do meio
­ Chamar recursivamente para os dois pedaços 
que sobraram (esquerda e direita)
INSTITUTO DE COMPUTAÇÃO - UFF 42
500
300 800
150 400 900600
150 300 400 500 600 800 900
IMPLEMENTAÇÃO
INSTITUTO DE COMPUTAÇÃO - UFF 43
void criaArvoreBalanceada(TNoA *raiz, int v[], int inicio, int fim) {
if (inicio <= fim) {
int meio = (inicio + fim) / 2;
raiz = insere(raiz, v[meio]);
//constroi subárvores esquerda e direita
criaArvoreBalanceada(raiz, v, inicio, meio - 1);
criaArvoreBalanceada(raiz, v, meio + 1, fim);
}
}
int main(void) {
int tam = 7;
int v[] = {150, 300, 400, 500, 600, 800, 900};
TNoA *raiz;
raiz = NULL;
criaArvoreBalanceada(raiz,v,0,tam-1);
imprime(raiz, 0);
};
EXCLUSÃO
?
500
300 800
150 400 900600
INSTITUTO DE COMPUTAÇÃO - UFF 44
Fonte de Referência:
Celes, W., Cerqueira, R., Rangel, J.L. 
Introdução a Estruturas de Dados, 
Campus, 1a Edição, 2004. 
EXCLUSÃO
Exclusão Física
3 casos
­ Nó é folha
­ Nó não folha
­ Possui uma subárvore
­ Possui duas subárvores
500
300 800
150 400 900600
INSTITUTO DE COMPUTAÇÃO - UFF 45
EXCLUSÃO – CASO 1: NÓ FOLHA
500
300 800
150 400 900600
INSTITUTO DE COMPUTAÇÃO - UFF 46
Quando o nó a ser excluído é uma folha, basta removê-lo
(lembrar de desalocar memória)
EXCLUSÃO – CASO 1: NÓ FOLHA
500
300 800
150 900600
INSTITUTO DE COMPUTAÇÃO - UFF 47
Quando o nó a ser excluído é uma folha, basta removê-lo
(lembrar de desalocar memória)
EXCLUSÃO – CASO 2: NÓ INTERNO COM APENAS 
UMA SUBÁRVORE
Raiz da subárvore passa a ocupar o lugar do nó excluído
550 650
500
300 800
150 400 600
INSTITUTO DE COMPUTAÇÃO - UFF 48
EXCLUSÃO – CASO 2: NÓ INTERNO COM APENAS 
UMA SUBÁRVORE
Raiz da subárvore passa a ocupar o lugar do nodo excluído
550 650
500
300
150 400
600
INSTITUTO DE COMPUTAÇÃO - UFF 49
EXCLUSÃO – CASO 3: NÓ POSSUI 2 SUBÁRVORES
Reestruturar a árvore
550 650
500
300 800
150 400 600 900
INSTITUTO DE COMPUTAÇÃO - UFF 50
EXCLUSÃO – CASO 3: NÓ POSSUI 2 SUBÁRVORES
Estratégia Recursiva
­ Trocar o valor do nó a ser removido com
­ valor do nó que tenha a maior chave da sua subárvore à esquerda (será o que adotaremos em aula); OU
­ valor do nó que tenha menor chave da sua subárvore à direita
­ Ir à subárvore onde foi feita a troca e remover o nó
INSTITUTO DE COMPUTAÇÃO - UFF 51
EXCLUSÃO – CASO 3: NÓ POSSUI 2 SUBÁRVORES
550 650
500
300 800
150 400 600 900
550
500
300 650
150 400 600 900
Þ
INSTITUTO DE COMPUTAÇÃO - UFF 52
EXCLUSÃO DO NÓ DE CHAVE 80
200
100 300
150
120
110 130
250
220 270
260
400
350 500
INSTITUTO DE COMPUTAÇÃO - UFF 53
1º. Caso: nó folha 80
EXCLUSÃO DO NÓ DE CHAVE 80
200
100 300
150
120
110 130
250
220 270
260
400
350 500
INSTITUTO DE COMPUTAÇÃO - UFF 54
1º. Caso: nó folha
EXCLUSÃO DO NÓ DE CHAVE 150
200
100 300
15080
120
110 130
250
220 270
260
400
350 500
INSTITUTO DE COMPUTAÇÃO - UFF 55
2º. Caso: nó com 
apenas 1 subárvore
EXCLUSÃO DO NÓ DE CHAVE 150
200
100 300
80 120
110 130
250
220 270
260
400
350 500
INSTITUTO DE COMPUTAÇÃO - UFF 56
2º. Caso: nó com 
apenas 1 subárvore
EXCLUSÃO DO NÓ DE CHAVE 300
200
100 300
15080 250
220 270
260
400
350 500
280
275 290
INSTITUTO DE COMPUTAÇÃO - UFF 57
3º. Caso: nó com 2 subárvores
EXCLUSÃO DO NÓ DE CHAVE 300
200
100 300
15080 250
220 270
260
400
350 500
280
275 290
INSTITUTO DE COMPUTAÇÃO - UFF 58
Encontrar maior valor da 
subárvore esquerda
EXCLUSÃO DO NÓ DE CHAVE 300
200
100 290
15080 250
220 270
260
400
350 500
280
275 290
INSTITUTO DE COMPUTAÇÃO - UFF 59
Encontrar maior valor da 
subárvore esquerda e substituir 
o nó a ser excluído por uma 
cópia do nó encontrado
EXCLUSÃO DO NÓ DE CHAVE 300
200
100 290
15080 250
220 270
260
400
350 500
280
275 290
INSTITUTO DE COMPUTAÇÃO - UFF 60
Excluir 290 (1º. Caso)
EXCLUSÃO DO NÓ DE CHAVE 300
200
100 290
15080 250
220 270
260
400
350 500
280
275
INSTITUTO DE COMPUTAÇÃO - UFF 61
FIM
EXCLUSÃO DO NÓ DE CHAVE 300 (OUTRA 
ÁRVORE)
200
100 300
15080
120
110 130
250
220 270
260
400
350 500
INSTITUTO DE COMPUTAÇÃO - UFF 62
3º. Caso: nó com 2 
subárvores
EXCLUSÃO DO NÓ DE CHAVE 300 (OUTRA 
ÁRVORE)
200
100 270
15080
120
110 130
250
220 270
260
400
350 500
INSTITUTO DE COMPUTAÇÃO - UFF 63
Encontrar maior valor da 
subárvore esquerda e substituir 
o nó a ser excluído por uma 
cópia do nó encontrado
EXCLUSÃO DO NÓ DE CHAVE 300 (OUTRA 
ÁRVORE)
200
100 270
15080
120
110 130
250
220 270
260
400
350 500
INSTITUTO DE COMPUTAÇÃO - UFF 64
Excluir 270 (2º. Caso)
EXCLUSÃO DO NÓ DE CHAVE 300 (OUTRA 
ÁRVORE)
200
100 270
15080
120
110 130
250
220 260
400
350 500
INSTITUTO DE COMPUTAÇÃO - UFF 65
FIM
EXCLUSÃO DE NÓ DE CHAVE 300 (TERCEIRO 
EXEMPLO) 200
100 300
15080 250
220 270
260
400
350 500
255 265 INSTITUTO DE COMPUTAÇÃO - UFF 66
3º. Caso: nó com 2 subárvores
EXCLUSÃO DE NÓ DE CHAVE 300 (TERCEIRO 
EXEMPLO) 200
100 300
15080 250
220 270
260
400
350 500
255 265 INSTITUTO DE COMPUTAÇÃO - UFF 67
Encontrar maior valor da 
subárvoreesquerda e substituir 
o nó a ser excluído por uma 
cópia do nó encontrado
EXCLUSÃO DE NÓ DE CHAVE 300 (TERCEIRO 
EXEMPLO) 200
100 270
15080 250
220 270
260
400
350 500
255 265 INSTITUTO DE COMPUTAÇÃO - UFF 68
Encontrar maior valor da 
subárvore esquerda e substituir 
o nó a ser excluído por uma 
cópia do nó encontrado
EXCLUSÃO DE NÓ DE CHAVE 300 (TERCEIRO 
EXEMPLO) 200
100 270
15080 250
220 270
260
400
350 500
255 265 INSTITUTO DE COMPUTAÇÃO - UFF 69
Excluir 270 (2º. Caso)
EXCLUSÃO DE NÓ DE CHAVE 300 (TERCEIRO 
EXEMPLO) 200
100 270
15080 250
220 260
400
350 500
255 265
INSTITUTO DE COMPUTAÇÃO - UFF 70
FIM
EXERCÍCIO
Dada a árvore a seguir, executar o 
procedimento de exclusão cumulativo 
dos seguintes nós: 
100 – 150 – 80 – 270 – 400 – 200 
INSTITUTO DE COMPUTAÇÃO - UFF 71
200
100 300
15080
120
110 130
250
220 270
260
400
350 50070
65 79
CONSIDERAÇÕES FINAIS
Para grandes volumes de dados, árvores binárias de busca não são as alternativas 
mais eficientes. 
Ao longo da disciplina veremos outras alternativas para buscas eficientes em 
grandes volumes de dados (Tabelas Hash, Árvores B, Árvores B+).
INSTITUTO DE COMPUTAÇÃO - UFF 73
AGRADECIMENTOS
Material baseado nos slides de Renata Galante, UFRGS
INSTITUTO DE COMPUTAÇÃO - UFF 74

Continue navegando