ÁRVORE BINÁRIA DE BUSCA TDA-ABB

Documentos relacionados
Árvores. SCC-202 Algoritmos e Estruturas de Dados I. Lucas Antiqueira

Estruturas de Dados II

DAINF - Departamento de Informática

ÁRVORE BINÁRIA DE BUSCA

ESTRUTURA DE DADOS E ALGORITMOS. Árvores Binárias de Busca. Cristina Boeres

Árvores Binária de Busca. Prof. César Melo DCC/ICE/UFAM

Árvores Binárias de Busca (ABB) 18/11

Algoritmos e Estrutura de Dados II. Árvore. Prof a Karina Oliveira.

Árvore Binária de Busca. Prof. César Melo

Árvores Binárias. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich

Pesquisa em memória primária

Estruturas de Dados. Módulo 17 - Busca. 2/6/2005 (c) Dept. Informática - PUC-Rio 1

INF 1010 Estruturas de Dados Avançadas. Árvores binárias

Aula 08. Estruturas de dados Árvore e Grafo

ÁRVORES E ÁRVORES BINÁRIAS. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Árvores Binárias de Busca (ABB) 18/11

Fontes Bibliográficas. Estruturas de Dados Aula 15: Árvores. Livros:

ÁRVORES E ÁRVORE BINÁRIA DE BUSCA

ÁRVORES BINÁRIAS DE BUSCA. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Árvores Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação

SUMÁRIO. Fundamentos Árvores Binárias Árvores Binárias de Busca

Árvores & Árvores Binárias

Árvores. SCC-214 Projeto de Algoritmos. Thiago A. S. Pardo. Um nó após o outro, adjacentes Sem relações hierárquicas entre os nós, em geral

Árvores. N-árias, Binárias, Busca. Vanessa Maia Berny Mestrado em Ciência da Computação

Árvores de Pesquisa. A árvore de pesquisa é uma estrutura de dados muito eficiente para armazenar informação.

Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo

Filas de Prioridade & Heaps

Árvores B. Prof. Márcio Bueno. / Fonte: Material da Prof a Ana Eliza Lopes Moura

Árvores. Fabio Gagliardi Cozman. PMR2300 Escola Politécnica da Universidade de São Paulo

Árvores Binárias. 16/11 Representação e Implementação: Encadeada Dinâmica O TAD

Estrutura de Dados. Carlos Eduardo Batista. Centro de Informática - UFPB

UNIVERSIDADE DE SÃO PAULO INSTITUTO DE CIÊNCIAS MATEMÁTICAS E DE COMPUTAÇÃO Departamento de Ciências de Computação

Árvores binárias de busca

Listas Estáticas. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof.

Carlos Eduardo Batista. Centro de Informática - UFPB

Programação II. Árvores Binárias (Binary Trees) Bruno Feijó Dept. de Informática, PUC-Rio

ESTRUTURA DE DADOS. Árvores, árvores binárias e percursos. Cristina Boeres

INF1007: Programação 2 10 Árvores Binárias. (c) Dept. Informática - PUC-Rio 1

Princípios de Desenvolvimento de Algoritmos MAC122 Prof. Dr. Paulo Miranda IME-USP

Árvores Binárias de Busca

PAA-DCC-UFAM. Árvores. Universidade Federal do Amazonas Departamento de Eletrônica e Computação

INF 1620 P2-01/11/03 Questão 1 Nome:

Conceitos gerais Terminologia Forma de Representação de Árvores Árvores Binárias

Aula T13 BCC202 Árvores. Túlio Toffolo

Algoritmos e Estrutura de Dados II. Árvore AVL. Prof a Karina Oliveira. Fonte: Prof a Ana Eliza

Exercícios: Árvores. Universidade Federal de Uberlândia - UFU Faculdade de Computação - FACOM Lista de exercícios de estrutura de dados em linguagem C

Listas Lineares Ordenadas

Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo

AED1 - Árvores. Hebert Coelho. Instituto de Informática Universidade Federal de Goiás. HC AED1-Árvores 1/49

Árvores binárias de busca

As duas soluções a seguir são exemplos da variedade de soluções admissíveis.

Árvores. Prof. César Melo DCC/ICE/UFAM

Árvores Binárias. 9/11 e 11/11 Conceitos Representação e Implementação

Árvores Binárias de Busca

UNIVERSIDADE DA BEIRA INTERIOR

Árvores. ! utilizada em muitas aplicações. ! modela uma hierarquia entre elementos. ! O conceito de árvores está diretamente ligado à recursão

Árvores Binárias Balanceadas Estrutura de Dados I

Linguagem C: Árvores Binarias

EAD Árvore árvore binária

GGI026 - Árvore rubro-negra - Remoção

Árvores. Algoritmos e Estruturas de Dados I. José Augusto Baranauskas Departamento de Física e Matemática FFCLRP-USP

Árvores. Prof. César Melo DCC/ICE/UFAM

Árvores AVL e Árvores B. Jeane Melo

INF 1007 Programação II

Módulo 9. Pesquisa em Memória Primária. Algoritmos e Estruturas de Dados II C++ (Rone Ilídio)

Árvore Binária de Busca

Árvores. Estruturas de Dados. Prof. Vilson Heck Junior

Aula T19 BCC202 Pesquisa (Parte 1) Pesquisa Binária. Túlio Toffolo

Transcrição:

ÁRVORE BINÁRIA DE BUSCA TDA-ABB

Conceitos Gerais sobre Árvores Uma árvore é uma estrutura hierárquica dividida em níveis, que ou está vazia, ou contém elementos chamados nós; Diferentemente da árvore natural, o nó-raiz de um TDA-árvore encontra-se acima dos demais nós. O nó-raiz é o ascendente comum de todos os nós da árvore. Os nós-folhas são as extremidades finais da árvore, portanto, nósfolhas não possuem descendentes. Diferentemente das pilhas, filas e listas, árvores se estendem em duas dimensões: na largura e na profundidade.

Conceitos Gerais sobre Árvores Nó pai, nó filho, nós irmãos: o nó raiz (m) é pai de s, p e a (raízes de subárvores). y, q e x são irmãos, pois estão no mesmo nível e filhas do mesmo nó-pai. Grau de um nó: quantidade de filhos que um determinado nó possui. As folhas têm grau zero. G m = G s = 3, G t = 1, G a = 2. Grau de uma árvore: quantidade máxima de filhos que um nó desta árvore pode apresentar.

Conceitos Gerais sobre Árvores Comprimento de um caminho: Contagem das arestas (há autores que contam os nós) atravessadas durante o percurso do caminho. Sendo assim, o caminho entre m e u será conjunto C = {m,a,u} e o comprimento deste caminho L = 2. Nível de profundidade de um nó: corresponde ao comprimento de um caminho que começa obrigatoriamente na raiz e vai até o nó considerado. A profundidade de u é, portanto, igual a dois. Altura de uma árvore: é o maior caminho entre a raiz e uma folha, em outras palavras, corresponde ao nível máximo de uma árvore. A altura da árvore (na figura) é igual a três, pois este é o maior comprimento de caminho que se apresenta na mesma.

Conceitos Gerais sobre Árvores Um árvore é dita completa quando todos os seus nós (exceto as folhas) apresentam o grau máximo d Nesse caso teremos: O total de nós de uma árvore (h corresponde à altura da árvore): h i =0 d h =d 0 d 1... d h k =S PG k S PG =a 1 q k 1 0 q 1 =d d h 1 1 d 1 www.brasilescola.com /matematica /soma uma pg finita.htm A quantidade de nós folha será: N= d h A altura será h=log d N soma dos k elementosde uma pg = d h 1 1 d 1

Árvores Binárias de Busca ABB São árvores de segundo grau projetadas para otimizar operações de busca. Tal otimização decorre da relação de ordem estabelecida entre os nós desta árvore, ou seja, considerando N como um nó qualquer (não folha!) da ABB, também considerando N esq e N dir, respectivamente, como o conjunto dos nós da subárvore esquerda e direita de N: x N esq e y N dir chave(x) < chave(n) < chave(y) chave( ) retorna o valor de um campo chave de ordenação do registro que representa um nó da ABB.

Árvores Binárias de Busca ABB Aqui se considera a chave como do tipo primária, no entanto, a inserção na ABB pode ser adaptada para lidar com uma chave do tipo secundária (identifica uma classe de instâncias de registros), nesse caso, cada nó da ABB poderia referenciar uma lista cujos itens possuiriam o mesmo valor para o campo de chave secundária.

Árv. Bin. de Busca Versus a Busca Binária V é um vetor com os dados. Inicio: indexa o início de V Fim: indexa a última posição ocupada em V BUSCA-BINÁRIA (V[], início, fim, chavedebusca) i = (fim+inicio)/2 // índice do meio entre início e fim se (v[i] = chavedebusca) entao devolva o índice i // elemento e encontrado senão (inicio = fim) entao não encontrou o elemento procurado senão se (V[i] vem antes de chavedebusca) então faça a BUSCA-BINÁRIA(V, i+1, fim, chavedebusca) senão faça a BUSCA-BINÁRIA(V, inicio, i-1, chavedebusca) fimse fimse

Árv. Bin. de Busca Versus a Busca Binária Veremos o código da busca na ABB mais adiante!!!

ABB implementada dinamicamente

Utilização de Funções como Argumento - Callback As ABB s devem dispor de algum recurso para comparar os valores dos campos chave dos registros para determinar a posição de um nó durante uma inserção ou a identificação de um nó em uma busca ou remoção. No entanto, no modelo de abstração de dados, não é permitido ao TDA o acesso direto a campos do registro de informação, já que os dados são tratados como pacotes fechados. Para a ABB será proposta a mesma solução utilizada na Fila de Prioridade, sempre que for conveniente o módulo de aplicação deverá prover funções auxiliares para as operações do TDA_ABB que as solicitarem.

Percursos em Árvores Árvores podem ser percorridas de maneira que todos os seus nós sejam visitados e processados (por funções de callback) convenientemente. Os percursos podem ser em profundidade: movimentos verticais OU... Podem ser em largura: movimentos horizontais Inicialmente veremos os percursos em profundidade...

1) Profundidade: percurso em ordem em_ordem(r, processa) se (r!= Null) em_ordem(r->esq, processa); processa(r); em_ordem(r->dir, processa); senão return; Exemplo considerando que a função PROCESSA( ) exibe a chave do elemento armazenado, teremos a seqüência: 100,200,430,840,860,910,1000

2) Profundidade: pós-ordem pos_ordem(r, processa) se (r!= Null) pos_ordem(r->esq, processa); pos_ordem(r->dir, processa); processa(r); senão return; 100,200,860,1000,910,840,430

3) Profundidade: pré-ordem pre_ordem(r, processa) se (r!= Null) processa(r); pre_ordem(r->esq, processa); pre_ordem(r->dir, processa); senão return; 430,200,100,840,910,860,1000

Percurso em largura Diferentemente dos percursos em profundidade, agora a visitação segue os níveis da árvore. PercursoEmLargura(arvore, processa) fila = Criafila(...); SE (arvore não está vazia E fila foi criada com sucesso) enfileira(raiz); ENQUANTO(fila não vazia) Desenfileira(noh); processa(noh); enfileira(filhoesq(noh)); enfileira(filhodir(noh)) destroifila(...);

Percurso em largura 430,200,840,100,910,860,1000

Percursos Qual dos percursos é interessante para a operação de destruição da árvore?

Implementação do TDA-ABB

Arquivo TDA_ABB_PRIV.H #include TDA_ABB.H typedef struct noabb { void *dados; struct noabb *esq; struct noabb *dir; } NoABB, *pnoabb; typedef struct ABB { pnoabb raiz; int taminfo; }ABB; Arquivo TDA_ABB.H /*funções auxiliares àquelas disponíveis na interface do TDA*/... void percorreemordem(pnoabb p, void (* processa)(void *p)); void percorreemposordem(pnoabb p, void (* processa)(void *p)); void percorreempreordem(pnoabb pa, void (* processa)(void *p)); void apaganoabb(pnoabb p);...

Arquivo APLICA.C Fragmento: funções de callback As funções de callback recebem seus protótipos em APLICA.H. /*dados os endereços de duas instâncias de registros de informação, há a comparação dos respectivos campos chaves e o retorno da relação entre eles: >, < ou = */ unsigned short comparacamposchaves1(void *pinfo1, void *pinfo2) { tipochave a1 = ((info *)pinfo1)->campochave, a2 = ((info *)pinfo2)->campochave; if (a1 > a2) return '>'; else if (a1 < a2) return '<'; else return '='; }

Arquivo TDA_ABB.C A Busca Ao introduzir a ABB utilizou-se a operação de busca para descrever o comportamento deste TDA, nesse momento cabe apenas exibir a codificação dessa operação. int buscaabb(pabb pa, void *destino, void *chave, unsigned short(* cmp)(void *p1, void *p2)) { pnoabb aux; unsigned int ret= FRACASSO; aux = pa->raiz; while( aux!= NULL && (*cmp)(chave,aux->dados)!= '=') aux = (*cmp)(chave,aux->dados)== '<'? aux->esq : aux->dir; if (aux!= NULL) { memcpy(destino, aux->dados, pa->taminfo); ret = SUCESSO; } return ret; }

A inserção A inserção bem sucedida em uma ABB (ordenada por chave primária) consiste basicamente em uma busca que fracassa, seguida da ligação de um novo nó folha. Cada nova inserção deve manter a relação de ordem entre os elementos: Para qualquer nó N não folha! Considerando N esq e N dir, respectivamente, como o conjunto dos nós da subárvore esquerda e direita de N, x N esq e y N dir, chave(x) < chave(n) < chave(y).

A remoção A remoção também deve manter a relação de ordem que caracteriza a ABB. Uma operação de remoção bem sucedida, consiste de duas etapas: i) inicialmente tem-se uma busca bem sucedida pelo nó alvo da operação, seguida de ii) a remoção propriamente dita do nó alvo. A fase ii do processo de remoção, não é uma operação tão simples. Nessa etapa, o algoritmo de remoção deve tratar três casos possíveis: a) Remoção de um nó folha; b) Remoção de um nó que possui apenas um filho e; c) Remoção de um nó que possui seus dois filhos.

A remoção: a remoção de nó folha é trivial.

A remoção: a remoção de nó com um único filho também é trivial.

A remoção Dos três casos acima citados, os itens a e b são triviais. O mais trabalhoso é o terceiro caso, pois exige a localização de um nó que substitua o nó removido, mantendo a mesma relação de ordem entre os elementos restantes na ABB. Para localizar este substituto deve-se buscar um nó cuja posição corresponda ao sucessor do nó alvo em um percurso em ordem A maioria dos algoritmos opta pelo nó sucessor, no entanto, pode-se utilizar o antecessor em ordem.

A remoção A localização do nó sucessor em ordem (substituto do nó alvo) é realizada na subárvore direita do nó alvo. Nesta subárvore deve-se localizar o elemento mais à esquerda e que não possua filho esquerdo. Localizado o substituto, a operação de remoção propriamente dita consistirá na substituição do nó alvo pelo seu substituto. A substituição é realizada por intermédio de manipulação dos campos de ligação entre os nós. O algoritmo de remoção também trata dos casos onde o nó alvo é a própria raiz da árvore.

Através substituindo sucessor pelo em Sucessor ordem em ordem

Remoção do nó 840 utilizando o seu antecessor

int removedaabb(pabb pa, void *chave, unsigned short (* cmp)(void *p1, void *p2), void *copia) { alvo = pa->raiz; while (alvo!= NULL && (*cmp)(chave,alvo->dados)!= '=') { paialvo = alvo; alvo = (*cmp)(chave,alvo->dados)== '<'? alvo->esq : alvo->dir; } if (alvo==null) /*alvo não encontrado */ return FRACASSO; if (alvo->esq == NULL) subst = alvo->dir; /*alvo possui um filho à dir*/ else if(alvo->dir == NULL) subst = alvo->esq;/*alvo possui um filho à esq*/ else /*alvo possui os dois filhos */ { paisubst = alvo; subst = alvo->dir; } avante = subst->esq; while( avante!= NULL) { paisubst = subst; subst = avante; avante = subst->esq; } if(paisubst!= alvo) { paisubst->esq = subst->dir; subst->dir = alvo->dir; } subst->esq = alvo->esq; } Remoção de um nó com os dois filhos utilizando o sucessor em ordem if(paialvo == NULL) pa->raiz = subst; /*alvo era a raiz*/ else alvo == paialvo->esq? (paialvo->esq = subst) : (paialvo->dir = subst); memcpy(copia,alvo->dados,pa->taminfo); free(alvo->dados); free(alvo); return SUCESSO;

Construa um TDA-ABB básico: Criação Remoção Inserção Busca Destruição Reinicialização Percursos (privativos) Contagem de folhas Contagem de semi-folhas Contagem de nós completos Determinação da altura da árvore Exibição estrutural (gráfica) da árvore etc...

TDA-ABB implementada de maneira estática

TDA-ABB implementada de maneira estática Para uma árvore binária completa, o tamanho do vetor pode ser calculado a partir do seu número de folhas: h total de nós= i=0 N h=log 2 N =número de folhas 2 i =2 h 1 1

TDA-ABB implementada de maneira estática Construa um TDA-ABB estaticamente alocado: 1)Criação; 2)Remoção; 3)Inserção; 4)Busca; 5)Destruição; 6)Reinicialização; 7)Percursos (privativos) 8)Altura; 9)Número de nós em determinado nível; etc...