Introdução

Pesquisa sequencial

Pesquisa binária

Árvore de pesquisa

Árvores balanceadas

Exercícios

Estruturas de Dados
Árvores Binárias de Pesquisa

André Gustavo dos Santos
Departamento de Informática Universidade Federal de Viçosa

INF 610 - 2013/1

Introdução

Pesquisa sequencial

Pesquisa binária

Árvore de pesquisa

Árvores balanceadas

Exercícios

Dicionário
Definição Um Dicionário é um tipo abstrato de dados para pesquisa. É usado para recuperar informação a partir de uma grande massa de informação previamente armazenada A informação é dividida em registros Cada registro possui uma chave a ser usada na pesquisa O objetivo da pesquisa é encontrar uma ou mais ocorrências de registros com chaves iguais à chave de pesquisa Pesquisa com sucesso x Pesquisa sem sucesso

Introdução

Pesquisa sequencial

Pesquisa binária

Árvore de pesquisa

Árvores balanceadas

Exercícios

Dicionário

Operações principais: Inicializar Pesquisar Inserir Retirar Outras operações: Ordenar Unir ...

Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Dicionário Estruturas mais utilizadas para implementar o TAD Dicionário: lista (arranjo) árvore binária de pesquisa tabela hash A escolha da estrutura de dados e do método de pesquisa associado dependem principalmente: da quantidade de dados envolvidos da frequência de inserções e retiradas .

.Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Pesquisa sequencial Método de pesquisa mais simples a partir do primeiro registro. então pare. pesquise sequencialmente até encontrar a chave procurada.

Estrutura de Dados #define MAX 100 typedef int TipoChave. . typedef struct TipoDicionario { TipoItem item[MAX+1]. int tamanho. /* outros componentes */ }.: armazenaremos os itens nas posições 1 a MAX. typedef struct TipoItem { TipoChave chave. } Obs.Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Pesquisa sequencial .

Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Pesquisa sequencial . . I NSERIR e R ETIRAR semelhantes às operações do TAD Lista.implementação Operações I NICIALIZAR.

TipoChave x) { for(int i=1.Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Pesquisa sequencial .implementação Operação P ESQUISAR int Pesquisar(TipoDicionario T. i<=T. //Pesquisa sem sucesso } .item[i]. i++) if (T. //Pesquisa com sucesso return 0.chave == x) return i.tamanho.

análise de complexidade Pesquisa com sucesso: melhor caso: C (n) = 1 pior caso: C (n) = n caso médio: C (n) = (n + 1)/2 Pesquisa sem sucesso: C (n) = n .Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Pesquisa sequencial .

//Pesquisa sem sucesso } . i>0. TipoChave x) { for(int i=T.tamanho.Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Pesquisa sequencial Note que a complexidade é a mesma se a pesquisa for feita de trás pra frente int Pesquisar(TipoDicionario T. i--) if (T.chave == x) return i.item[i]. //Pesquisa com sucesso return 0.

i>0 && T.Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Pesquisa sequencial É a mesma também se a comparação de chaves for feita no teste do laço int Pesquisar(TipoDicionario T.chave!=x.item[i]. } Obs.tamanho.: a pesquisa para no índice 0 ou ao encontrar um item com a chave. TipoChave x) { for(int i=T. i--). . return i.

item[i]. } O sentinela na posição 0 elimina o teste de limite do arranjo.chave != x. garantindo uma pesquisa “com sucesso” A complexidade é a mesma. mas o laço é extremamente simples. T.item[0].tamanho.Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Pesquisa sequencial rápida O uso de sentinela simplifica o laço: int Pesquisar(TipoDicionario T. TipoChave x) { T.chave = x. return i. //Sentinela for(int i=T. i--). diminuindo a constante (custo de cada iteração) .

. . . refazer a pesquisa a partir do item seguinte ao último encontrado.se for necessário tal tipo de pesquisa. Para encontrar outra ocorrência.Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Pesquisa sequencial A pesquisa sequencial é a melhor escolha para um dicionário com poucos itens Note que o código mostrado não suporta pesquisa por mais de uma ocorrência.. para conter o índice a partir do qual se quer pesquisar. pode-se incluir um argumento a mais...

Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Pesquisa binária A pesquisa numa lista pode ser mais eficiente se os itens forem mantidos em ordem Para pesquisar uma chave na lista: Compare a chave com a do item presente no meio da lista Se a chave é menor então pesquise na 1a metade da lista Se a chave é maior então pesquise na 2a metade da lista Repita o processo até encontrar a chave. ou ficar apenas um item e sua chave for diferente da pesquisada .

implementação Exercício #1 :D .Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Pesquisa binária .

. Inserção e retirada podem causar movimentação de muitos itens (n no pior caso) Então não deve ser usada em aplicações muito dinâmicas ..Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Pesquisa binária Complexidade melhor caso: C (n) = 1 pior caso: C (n) = log n caso médio: C (n) ≈ log n Em comparação com a pesquisa sequencial: Complexidade bem menor no pior caso e caso médio Porém. o custo para manter o dicionário ordenado é alto. ...

porém com pior desempenho nas demais. existe uma estrutura mais eficiente. A árvore apresenta um bom compromisso de todos os itens. Adequada quando é necessário considerar todos ou uma combinação de: Acesso direto e sequencial eficientes Facilidade de inserção e de retirada de itens Boa taxa de utilização de memória Para cada item acima. .Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Árvore Árvore é uma estrutura de dados muito eficiente para armazenar informação.

a árvore possui: um nodo especial. .: note que todo nodo de uma árvore é raiz de alguma subárvore. Senão. Tk subárvores disjuntas Obs. chamado raiz uma partição dos demais nodos em T1 . note ainda que cada subárvore Ti é uma árvore.Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Árvore Definição Uma árvore é coleção finita de n nodos (n ≥ 0). . T2 . . a definição é recursiva! . Se n = 0 dizemos que a árvore é nula. .

Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Árvore ** Desenho .

Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Árvore Terminologia: grau de um nodo grau de uma árvore folha filho/pai ancestral/descendente nível de um nodo altura de uma árvore .

estrutura de dados eficiente para dicionários com grande volume de dados .Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Árvore Uma árvore estabelece uma relação hierárquica entre os itens É uma estrutura bastante usada em ciência da computação organização de informações em bancos de dados estrutura sintática de programas fontes em compiladores técnicas backtracking e branch-and-bound e muitas outras aplicações entre elas.

é uma árvore de grau (no máximo) 2. .: ou seja.Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Árvore binária Definição Uma árvore binária é um árvore que pode ser nula ou então possuir: um nodo especial. chamado raiz uma partição dos demais nodos em T1 e T2 . duas árvores binárias disjuntas denominadas subárvore esquerda e subárvore direita Obs.

Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Árvore binária ** Desenho .

Os da esquerda seriam menores.: itens com chaves iguais podem ser colocadas na subárvore da direita. .Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Árvore binária de pesquisa Definição Uma árvore binária de pesquisa é um árvore binária com as propriedades: um nodo especial. chamado raiz todos os itens com chaves menores que a da raiz estão na subárvore da esquerda todos os itens com chaves maiores que a da raiz estão na subárvore da direita as subárvores também são árvores binárias de pesquisa Obs. e os da direita não menores. por exemplo.

Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Árvore binária de pesquisa ** Desenho .

// outros componentes }.Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Árvore binária de pesquisa .implementação Estrutura do item typedef int TipoChave. . typedef struct TipoItem { TipoChave chave.

. TipoArvore subArvEsq. TipoArvore subArvDir. no caso seu nodo raiz typedef struct TipoNodo* TipoArvore.implementação Estrutura do nodo e da árvore //A arvore e’ um apontador para um nodo.. }.. . //Um nodo possui um item //.. //. e apontadores para suas subarvores typedef struct TipoNodo { TipoItem item.Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Árvore binária de pesquisa .

} .implementação Operação I NICIALIZA void Inicializa(TipoArvore &a) { a = NULL.Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Árvore binária de pesquisa .

TipoChave x) { if (a == NULL) return NULL.chave) return Pesquisa(a->subArvEsq. //sem sucesso if (x == a->item.implementação Operação P ESQUISA //Pesquisa e retorna um item com a chave ’x’ pesquisada TipoItem* Pesquisa(TipoArvore a.chave) return &(a->item). x). //com sucesso if (x < a->item. //pesquisa na subarv if (x > a->item. //pesquisa na subarv } .Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Árvore binária de pesquisa . x).chave) return Pesquisa(a->subArvDir.

x). } if (x.chave) return Insere(a->subArvDir.chave < a->item.ele contem o item inserido a->subArvEsq = NULL. //insere na subarvore d } . //.chave >= a->item.//. x).nao tem subarvore esquerda a->subArvDir = NULL. //Cria novo nodo: . //insere na subarvore e if (x. TipoItem x) { if (a == NULL) { //Encontrou local de insercao a = new TipoNodo.//.Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Árvore binária de pesquisa .nem subarvore direita return.chave) return Insere(a->subArvEsq.a arvore aponta a->item = x.implementação Operação I NSERE //Insere um item ’x’ na posicao apropriada da arvore ’a’ void Insere(TipoArvore &a.

Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Árvore binária de pesquisa .. imprimindo todos os itens . cout << a->item. e os imprime ’em-ordem’ void Caminhamento(TipoArvore a) { if (a == NULL) return.implementação Operação C AMINHAMENTO //Caminha na arvore (percorre todos os nodos //.. Caminhamento(a->subArvEsq). //imprime demais componentes Caminhamento(a->subArvDir). } Percorre toda a árvore.chave << endl.

implementação Operação R ETIRA Casos a considerar na retirada: Nodo retirado não tem filhos Nodo retirado tem um único filho Nodo retirado tem dois filhos .Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Árvore binária de pesquisa .

implementação Operação R ETIRA ** Desenho .Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Árvore binária de pesquisa .

pelo descendente mais à direita da subárvore esquerda ou pelo descendente mais à esquerda da subárvore direita .implementação Operação R ETIRA Casos a considerar na retirada: Nodo retirado não tem filhos basta retirá-lo (seu pai aponta para NULL) Nodo retirado tem um único filho substitui-lo pelo filho (seu pai aponta para seu filho) Nodo retirado tem dois filhos substitui-lo pelo filho de maior chave da subárvore esquerda ou pelo filho de menor chave da subárvore direita ou seja.Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Árvore binária de pesquisa .

Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Árvore binária de pesquisa .implementação Operação R ETIRA Exercício #2 :( .

e seria esse o pior caso. (no pior caso... n) A altura depende muito do formato (ordem de inserção)!!! Se os itens forem bem distribuídos nas subárvores.Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Árvore binária de pesquisa Complexidade melhor caso: C (n) = 1 pior caso: C (n) = altura da árvore. . a altura pode ser log n.

manter a árvore completamente balanceada todo o tempo aumenta a complexidade das operações I NSERE e R ETIRA Solução: árvores “quase” balanceadas . Dessa forma a operação P ESQUISA tem pior caso na ordem de log n. a diferença de altura das subárvores esquerda e direita é no máximo 1.Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Árvores balanceadas Numa árvore completamente balanceada. Entretanto.

Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Exercícios de implementação Exercício #1 Implementar a função P ESQUISA B INARIA em arranjo ordenado Exercício #2 Implementar a função R ETIRA da árvore binária de pesquisa .

que retorna a altura de uma árvore binária de pesquisa Exercício #4 Implementar uma função C ONT F OLHAS. que retira o item com maior chave . que retorna o número de folhas Exercício #5 Implementar uma função C ONT I NTERNOS. que retorna o número de nós internos (não folhas) Exercício #6 Implementar uma função R ETIRA M AIOR.Introdução Pesquisa sequencial Pesquisa binária Árvore de pesquisa Árvores balanceadas Exercícios Exercícios de implementação Exercício #3 Implementar uma função A LTURA.