Árvores binárias de busca - 0.5cmscc0202 - algoritmos e ... · nestecaso,existem2 opções...
TRANSCRIPT
Árvores Binárias de Busca
Árvores Binárias de Busca
SCC0202 - Algoritmos e Estruturas de Dados I
Prof. Fernando V. Paulovich*Baseado no material do Prof. Gustavo Batista
http://www.icmc.usp.br/[email protected]
Instituto de Ciências Matemáticas e de Computação (ICMC)Universidade de São Paulo (USP)
4 de novembro de 2010
Árvores Binárias de BuscaConceitos Introdutórios
Sumário
1 Conceitos Introdutórios
2 Inserção em Árvores Binárias de Busca
3 Pesquisa em Árvores Binárias de Busca
4 Remoção em Árvores Binárias de Busca
5 Conceitos Adicionais
Árvores Binárias de BuscaConceitos Introdutórios
Sumário
1 Conceitos Introdutórios
2 Inserção em Árvores Binárias de Busca
3 Pesquisa em Árvores Binárias de Busca
4 Remoção em Árvores Binárias de Busca
5 Conceitos Adicionais
Árvores Binárias de BuscaConceitos Introdutórios
Definições
Uma Árvore Binária de Busca (ABB) possui asseguintes propriedades
É uma Árvore Binária (AB)Seja S = {s1, . . . , sn} o conjunto de chaves dos nós daárvore T
Esse conjunto satisfaz s1 < . . . < snA cada nó vj ∈ T está associada uma chave distintasj ∈ S, que pode ser consultada por r(vj) = sj
Dado um nó v de T
Se vi pertence a sub-árvore esquerda de v, entãor(vi) < r(v)Se vi pertence a sub-árvore direita de v, entãor(vi) > r(v)
Árvores Binárias de BuscaConceitos Introdutórios
Definições
Em outras palavrasOs nós pertencentes à sub-árvore esquerda possuemvalores menores do que o valor associado ao nó-raiz rOs nós pertencentes à sub-árvore direita possuem valoresmaiores do que o valor associado ao nó-raiz r
Árvores Binárias de BuscaConceitos Introdutórios
Definições
Um percurso em-ordem em uma ABB resulta nasequência de valores em ordem crescenteSe invertêssemos as propriedades descritas nadefinição anterior, de maneira que a sub-árvore esquerdade um nó contivesse valores maiores e a sub-árvore direitavalores menores, o percurso em-ordem resultaria nosvalores em ordem decrescenteUma ABB criada a partir de um conjunto de valoresnão é única: o resultado depende da sequência deinserção dos dados
Árvores Binárias de BuscaConceitos Introdutórios
Definições
A grande utilidade da árvore binária de busca é armazenardados contra os quais outros dados são frequentementeverificados (busca!)Uma árvore de binária de busca é dinâmica e pode sofreralterações (inserções e remoções de nós) após ter sidocriada
Árvores Binárias de BuscaConceitos Introdutórios
Operações em ABB’s
InserçãoPesquisaRemoção
Árvores Binárias de BuscaInserção em Árvores Binárias de Busca
Sumário
1 Conceitos Introdutórios
2 Inserção em Árvores Binárias de Busca
3 Pesquisa em Árvores Binárias de Busca
4 Remoção em Árvores Binárias de Busca
5 Conceitos Adicionais
Árvores Binárias de BuscaInserção em Árvores Binárias de Busca
Inserção (operações em ABB’s)
Passos do algoritmo de inserçãoProcure um “local” para inserir o novo nó, começando aprocura a partir do nó-raizPara cada nó-raiz de uma sub-árvore, compare; se o novonó possui um valor menor do que o valor no nó-raiz (vaipara sub-árvore esquerda), ou se o valor é maior que ovalor no nó-raiz (vai para sub-árvore direita)Se um ponteiro (filho esquerdo/direito de um nó-raiz)nulo é atingido, coloque o novo nó como sendo filho donó-raiz
Árvores Binárias de BuscaInserção em Árvores Binárias de Busca
Inserção
Para entender o algoritmo considere a inserção doconjunto de números, na sequência
17,99,13,1,3,100,400
No início a ABB está vazia!
Árvores Binárias de BuscaInserção em Árvores Binárias de Busca
Inserção
O número 17 será inseridotornando-se o nó raizA inserção do 99 inicia-se naraiz. Compara-se 99 com 17Como 99 > 17, 99 deve sercolocado na sub-árvore direitado nó contendo 17 (subárvoredireita, inicialmente, nula)
Árvores Binárias de BuscaInserção em Árvores Binárias de Busca
Inserção
A inserção do 13 inicia-se naraizCompara-se 13 com 17.Como 13 < 17, 13 deve sercolocado na sub-árvoreesquerda do nó contendo 17Já que o nó 17 não possuidescendente esquerdo, 13 éinserido na árvore nessaposição
Árvores Binárias de BuscaInserção em Árvores Binárias de Busca
Inserção
Repete-se o procedimentopara inserir o valor 11 < 17, então será inserido nasub-árvore esquerdaChegando nela, encontra-se onó 13, 1 < 13 então ele seráinserido na sub-árvoreesquerda de 13
Árvores Binárias de BuscaInserção em Árvores Binárias de Busca
Inserção
Repete-se o procedimentopara inserir o elemento 3
3 < 173 < 133 > 1
Árvores Binárias de BuscaInserção em Árvores Binárias de Busca
Inserção
Repete-se o procedimentopara inserir o elemento 100
100 > 17100 > 99
Árvores Binárias de BuscaInserção em Árvores Binárias de Busca
Inserção
Repete-se o procedimentopara inserir o elemento 400
400 > 17400 > 99400 > 100
Árvores Binárias de BuscaInserção em Árvores Binárias de Busca
Relembrando
1 typedef struct {2 int chave;3 int valor;4 } INFO;56 typedef struct NO {7 INFO info;8 struct NO *fesq;9 struct NO *fdir;
10 } NO;1112 typedef struct {13 NO *raiz;14 } ARVORE;
Árvores Binárias de BuscaInserção em Árvores Binárias de Busca
Relembrando
1 void criar(ARVORE *arv) {2 arv->raiz = NULL;3 }45 int criar_raiz(ARVORE *arv, INFO *info) {6 arv->raiz = (NO*)malloc(sizeof(NO));78 if (arv->raiz != NULL) {9 arv->raiz->fesq = NULL;
10 arv->raiz->fdir = NULL;11 arv->raiz->info = *info;12 return 1;13 }1415 return 0;16 }
Árvores Binárias de BuscaInserção em Árvores Binárias de Busca
Relembrando
1 NO *inserir_direita(NO *no, INFO *info) {2 no->fdir = (NO*)malloc(sizeof(NO));34 if (no->fdir != NULL) {5 no->fdir->fesq = NULL;6 no->fdir->fdir = NULL;7 no->fdir->info = *info;8 }9
10 return no->fdir;11 }1213 NO *inserir_esquerda(NO *no, INFO *info) {14 no->fesq = (NO*)malloc(sizeof(NO));1516 if (no->fesq != NULL) {17 no->fesq->fesq = NULL;18 no->fesq->fdir = NULL;19 no->fesq->info = *info;20 }2122 return no->fesq;23 }
Árvores Binárias de BuscaInserção em Árvores Binárias de Busca
Código
1 int inserir_aux(NO *no, INFO *info) {2 if (no->info.chave > info->chave) {3 if (no->fesq == NULL) {4 return (inserir_esquerda(no, info) != NULL);5 } else {6 return inserir_aux(no->fesq, info);7 }8 } else {9 if (no->fdir == NULL) {
10 return (inserir_direita(no, info) != NULL);11 } else {12 return inserir_aux(no->fdir, info);13 }14 }15 }161718 int inserir(ARVORE *arv, INFO *info) {19 if (arv->raiz == NULL) {20 return criar_raiz(arv, info);21 } else {22 return inserir_aux(arv->raiz, info);23 }24 }
Árvores Binárias de BuscaInserção em Árvores Binárias de Busca
Exercícios
Criar um método iterativo para inserção em ABB
Árvores Binárias de BuscaPesquisa em Árvores Binárias de Busca
Sumário
1 Conceitos Introdutórios
2 Inserção em Árvores Binárias de Busca
3 Pesquisa em Árvores Binárias de Busca
4 Remoção em Árvores Binárias de Busca
5 Conceitos Adicionais
Árvores Binárias de BuscaPesquisa em Árvores Binárias de Busca
Pesquisa (operações em ABB’s)
Passos do algoritmo de buscaComece a busca a partir do nó-raizPara cada nó-raiz de uma sub-árvore compare: se o valorprocurado é menor que o valor no nó-raiz (continua pelasub-árvore esquerda), ou se o valor é maior que o valorno nó-raiz (sub-árvore direita)Caso o nó contendo a chave pesquisada seja encontrado,retorne true e o nó pesquisado, caso contrário retornefalse
Árvores Binárias de BuscaPesquisa em Árvores Binárias de Busca
Pesquisa
1 int buscar_aux(NO *no, INFO *info) {2 if (no == NULL) {3 return 0;4 } else {5 if (no->info.chave > info->chave) {6 return buscar_aux(no->fesq, info);7 } else if (no->info.chave < info->chave) {8 return buscar_aux(no->fdir, info);9 } else {
10 info->valor = no->info.valor;11 return 1;12 }13 }14 }1516 int buscar(ARVORE *arv, INFO *info) {17 return buscar_aux(arv->raiz, info);18 }
Árvores Binárias de BuscaPesquisa em Árvores Binárias de Busca
Exercícios
Criar um método iterativo para busca em ABB
Árvores Binárias de BuscaRemoção em Árvores Binárias de Busca
Sumário
1 Conceitos Introdutórios
2 Inserção em Árvores Binárias de Busca
3 Pesquisa em Árvores Binárias de Busca
4 Remoção em Árvores Binárias de Busca
5 Conceitos Adicionais
Árvores Binárias de BuscaRemoção em Árvores Binárias de Busca
Remoção (operações em ABB’s)
Casos a serem considerados no algoritmo de remoção denós de uma ABB
Caso 1: o nó é folhaO nó pode ser retirado sem problema
Caso 2: o nó possui uma sub-árvore (esq/dir)O nó-raiz da sub-árvore (esq/dir) “ocupa” o lugar do nóretirado
Caso 3: o nó possui duas sub-árvoresO nó contendo o menor valor da sub-árvore direita pode“ocupar” o lugarOu o maior valor da sub-árvore esquerda pode “ocupar”o lugar
Árvores Binárias de BuscaRemoção em Árvores Binárias de Busca
Remoção - Caso 1
Caso o valor a ser removidoseja o 15Pode ser removido semproblema, não requer ajustesposteriores
Árvores Binárias de BuscaRemoção em Árvores Binárias de Busca
Remoção - Caso 1
Os nós com os valores 10 e 13também podem ser removidos
Árvores Binárias de BuscaRemoção em Árvores Binárias de Busca
Remoção - Caso 2
Removendo-se o nó com ovalor 5Como ele possui somente asub-árvore direita, o nócontendo o valor 6 pode“ocupar” o lugar do nóremovido
Árvores Binárias de BuscaRemoção em Árvores Binárias de Busca
Remoção - Caso 2
Esse segundo caso é análogo,caso existisse um nó comsomente uma sub-árvoreesquerda
Árvores Binárias de BuscaRemoção em Árvores Binárias de Busca
Remoção - Caso 3
Eliminando-se o nó de chave11Neste caso, existem 2 opções
O nó com chave 10 pode“ocupar” o lugar donó-raiz, ouO nó com chave 12 pode“ocupar” o lugar do nó-raiz
Árvores Binárias de BuscaRemoção em Árvores Binárias de Busca
Remoção
1 int remover_aux(ARVORE *arv, NO *pant, NO *prem, int chave) {2 if (prem == NULL) { //chave não encontrada3 return 0;4 } else if (prem->info.chave > chave) {5 return remover_aux(arv, prem, prem->fesq, chave);6 } else if (prem->info.chave < chave) {7 return remover_aux(arv, prem, prem->fdir, chave);8 } else {9 //tem apenas um filho
10 if (prem->fdir == NULL || prem->fesq == NULL) {11 //pega o único filho não nulo12 NO *pprox = (prem->fdir == NULL) ? prem->fesq : prem->fdir;1314 if (pant == NULL) arv->raiz = pprox;15 else if (pant->fdir == prem) pant->fdir = pprox;16 else pant->fesq = pprox;1718 free(prem);19 } else { //tem os dois filhos20 //troca com o maximo da subarvore esquerda21 trocar_max_esq(prem, prem, prem->fesq);22 }2324 return 1;25 }26 }
Árvores Binárias de BuscaRemoção em Árvores Binárias de Busca
Remoção
Troca com o máximo elemento da sub-árvore esquerda
1 void trocar_max_esq(NO *prem, NO *pant, NO *pno) {2 if (pno->fdir != NULL) {3 trocar_max_esq(prem, pno, pno->fdir);4 } else {5 //raiz da arvore esquerda tem filhos a direita6 if (pant != prem) pant->fdir = pno->fesq;7 else pant->fesq = pno->fesq;89 prem->info = pno->info;
10 free(pno);11 }12 }
Árvores Binárias de BuscaRemoção em Árvores Binárias de Busca
Remoção
1 int remover(ARVORE *arv, int chave) {2 if (arv->raiz != NULL) {3 return remover_aux(arv, NULL, arv->raiz, chave);4 }5 return 0;6 }
Árvores Binárias de BuscaConceitos Adicionais
Sumário
1 Conceitos Introdutórios
2 Inserção em Árvores Binárias de Busca
3 Pesquisa em Árvores Binárias de Busca
4 Remoção em Árvores Binárias de Busca
5 Conceitos Adicionais
Árvores Binárias de BuscaConceitos Adicionais
Complexidade da busca em ABB
Pior casoNúmero de passos é determinado pela altura da árvoreÁrvore degenerada possui altura igual a n
Altura da árvore depende da sequência de inserção daschaves
O que acontece se uma sequência ordenada de chaves éinserida
Busca eficiente se árvore razoavelmente balanceada
Árvores Binárias de BuscaConceitos Adicionais
Árvores Binárias de Busca
ABB “aleatória”Nós externos: descendentes dos nós folha (não estão, defato, na árvore)Uma árvore A com n nós possui n+ 1 nós externosUma inserção em A é considerada “aleatória” se ela temprobabilidade igual de acontecer em qualquer um dosn+ 1 nós externosUma ABB aleatória com n nós é uma árvore resultantede n inserções aleatórias sucessivas em uma árvoreinicialmente vazia
Árvores Binárias de BuscaConceitos Adicionais
Árvores Binárias de Busca
É possível demonstrar que para uma ABB “aleatória” onúmero esperado de comparações para recuperar umregistro qualquer é cerca de 1, 39 ∗ log2(n)
39% pior do que o custo do acesso em uma árvorebalanceada
Pode ser necessário garantir um melhor balanceamento daABB para melhor desempenho na busca
Árvores Binárias de BuscaConceitos Adicionais
Árvores Binárias de Busca
As complexidade das operações de inserção e remoçãotambém dependem da eficiência da buscaO tempo necessário para realizar essas operações dependeprincipalmente do tempo necessário para encontrar aposição do nó a ser inserido/removidoA remoção ainda pode requerer encontrar o nó máximoda sub-árvore esquerda (troca_max_esq(...)), mas onúmero de operações realizadas é sempre menor ou igualdo que a altura da árvore
Árvores Binárias de BuscaConceitos Adicionais
Exercícios
Quais sequências de inserções criam uma ABBdegenerada? Quais sequências criam uma ABBbalanceada?Implemente um TAD para árvores binárias de busca comas operações discutidas em aulaImplemente uma versão iterativa do algoritmo deremoção em ABBs
Árvores Binárias de BuscaConceitos Adicionais
Exercícios
Escreva uma função que verifique se uma árvore bináriaestá perfeitamente balanceada
O número de nós de suas sub-árvores esquerda e direitadifere em, no máximo, 1