ÁRVORES
SUMÁRIO Fundamentos Árvores Binárias Árvores Binárias de Busca 2
ÁRVORES Utilizadas em muitas aplicações Modelam uma hierarquia entre elementos árvore genealógica Diagrama hierárquico de uma organização Modelagem de algoritmos * O conceito de árvores está diretamente ligado à recursão * 3
ÁRVORES um conjunto finito de elementos onde um elemento é chamado de raiz os outros são divididos em subconjuntos disjuntos, onde cada um define uma árvore cada elemento é um nó ou vértice da árvore arcos ou arestas conectam os vértices 4
ÁRVORES uma coleção não vazia de vértices e ramos que satisfazem a certos requisitos vértice (ou nó): é um objeto simples que pode ter um nome e mais alguma outra informação associada arco ou aresta (direcionado ou não): é uma conexão entre dois nós 5
REPRESENTAÇÃO Á r v o r e A B C C E F G H I J K L M N O P Q R S 6
EXEMPLO 7
TERMINOLOGIA E PROPRIEDADES Cada vértice (exceto a raiz) tem exatamente um antecessor imediato ou pai Cada vértice tem nós sucessores imediatos ou filhos, a não ser: nós sem filhos : terminais ou folhas Filhos de um mesmo pai - irmãos Nós com pelo menos um filho : nãoterminais ou internos 8
TERMINOLOGIA E PROPRIEDADES caminho em uma árvore: é uma lista de vértices distintos e sucessivos, conectados por arcos (arestas) da árvore nó raiz existe exatamente um caminho entre a raiz e cada um dos nós da árvore se existir mais de um caminho ou nenhum grafo 9
TERMINOLOGIA E PROPRIEDADES grau é o número de subárvores de um nó no exemplo: grau de A é 3; de N é 4; de J é 1 qualquer nó é a raiz de uma sub-árvore consistindo dele e dos nós abaixo 10
ÁRVORES Á r v o r e ( 1 ) Á r v o r e ( 2 ) A A B C D C D B E F G G E F 11
ÁRVORES A única diferença entre as duas árvores é a ordem das sub-árvores Uma árvore ordenada é definida como uma árvore onde as sub-árvore formam um conjunto ordenado Em uma árvore ordenada define-se o primeiro, segundo e último irmão, de acordo com alguma propriedade 12
TERMINOLOGIA os vértices da árvore estão classificados em níveis é o número de nós no caminho entre o vértice e a raiz nível da raiz é zero A nível de C é 1 B C D nível de K é 3 E F G H I L J K M N nível de um nó = nível de seu pai + 1 nível de P é 5 O P Q R S 13
TERMINOLOGIA Altura de uma árvore corresponde ao maior nível maior distância entre a raiz e qualquer nó Floresta um conjunto de árvores se removemos a raiz e os arcos que a ligam às sub-árvores, ficamos com uma floresta 14
15 ÁRVORES BINÁRIAS
DEFINIÇÃO Árvore Binária T é um conjunto finito de elementos denominados nós ou vértices, tal que: T = 0 e a árvore é dita vazia ou Existe um nó r, chamado raiz de T, e os nós restantes podem ser divididos em dois subconjuntos disjuntos, Tre e Trd, que são as sub-árvores esquerda e direita de r, respectivamente e as quais, por sua vez, também são árvores binárias. 16
VANTAGENS Possuem um número constante de subárvores em cada nó Limitação do número de ponteiros usados Algoritmos eficientes para o tratamento A forma de armazenar os nós surge naturalmente de sua definição: Ponteiro para o nó raiz (como nas listas lineares) Ponteiros para os filhos: esq e dir Necessita de 2n+1 ponteiros para representar n nós. 17
VISUALIZAÇÃO DA ÁRVORE BINÁRIA USANDO PONTEIROS esq raiz A dir B C D E F G H I 18
OPERAÇÕES BÁSICAS DA ÁRVORE BINÁRIA (INTERFACE DO TIPO ÁRVORE) Criar uma árvore vazia Criar uma árvore não vazia Verificar se a árvore está vazia Verificar se um elemento pertence a árvore Liberar uma árvore Imprimir os nós da árvore 19
IMPLEMENTAÇÃO DE ÁRVORES BINÁRIAS O acesso a uma árvore se dará através de um ponteiro para o nó raiz A estrutura de um nó deve ser composta por: um campo que guarda a informação e dois ponteiros: um para a sub-árvore da esquerda e um para a sub-árvore da direita Funções são implementadas utilizando definição recursiva da estrutura 20
IMPLEMENTAÇÃO DE ÁRVORES BINÁRIAS Arv* arv_criavazia() { return NULL; } Arv* arv_cria(char c, Arv* sae, Arv* sad) { Arv* a = (Arv*) malloc (sizeof(arv)); // ou, em C++: // Arv* a = new Arv; a-> info = c; a-> esq=sae; a-> dir = sad; return a; } 21
IMPLEMENTAÇÃO DE ÁRVORES BINÁRIAS Função que verifica se elemento pertence a árvore 22
IMPLEMENTAÇÃO DE ÁRVORES BINÁRIAS Função que libera a estrutura da árvore Função que verifica se uma árvore está vazia 23
IMPLEMENTAÇÃO DE ÁRVORES BINÁRIAS Função que imprime elementos da árvore 24
EXEMPLO DE CRIAÇÃO DE UMA ÁRVORE 25
EXEMPLO DE USO DA IMPRESSÃO 26
INSERINDO UMA SUB-ÁRVORE NUMA ÁRVORE Dada a árvore Inserir a sub-árvore A esquerda do nó b 27
LIBERANDO UMA SUB-ÁRVORE NUMA ÁRVORE Dada a árvore Liberar a sub-árvore e 28
CRIAÇÃO E LIBERAÇÃO Note que a definição de árvore, por ser recursiva, não faz distinção entre árvores e sub-árvores. Assim, a função cria pode ser utilizada para acrescentar (enxertar) uma sub-árvore em um ramo de uma árvore, e libera pode ser usada para remover ( podar ) uma sub-árvore qualquer de uma árvore dada. 29
PERCURSOS EM ÁRVORES BINÁRIAS A busca nada mais é do que um percurso em uma árvore O percurso em uma árvore visitando cada nó uma única vez gera uma seqüência linear de nós Assim, passa a ter sentido falar em sucessor e predecessor de um nó segundo um determinado percurso Há três maneiras recursivas de se percorrer árvores binárias: Percurso em pré-ordem Percurso em pós-ordem Percurso em ordem 30
PERCURSO EM PRÉ-ORDEM Algoritmo básico: Se árvore vazia : fim visitar o nó raiz (imprimí-lo) percorrer em pré-ordem a sub-árvore esquerda percorrer em pré-ordem a sub-árvore direita ABDCEGFHI 31
PERCURSO EM EM ORDEM Algoritmo básico: Se árvore vazia : fim percorrer em ordem a sub-árvore esquerda visitar o nó raiz (imprimí-lo) percorrer em ordem a sub-árvore direita DBAEGCHFI 32
PERCURSO EM PÓS-ORDEM Algoritmo básico: Se árvore vazia : fim percorrer em ordem a sub-árvore esquerda percorrer em ordem a sub-árvore direita visitar o nó raiz (imprimí-lo) DBGEHIFCA 33
IMPLEMENTAÇÕES DAS OPERAÇÕES Diversas operações se utilizam desses algoritmos de percurso em árvore durante sua execução: Inserção, Remoção, nível, etc... Exemplo: Operação Esvaziar: esvaziar toda a árvore Operação Nível: Implementar uma função para retornar o nível de um elemento na árvore Observações: Supõe-se que todas as chaves sejam diferentes 34
ALTURA DE UMA ÁRVORE Propriedade Fundamental de Árvores Só existe um caminho da raiz para qualquer nó Definição de Altura de Árvore É o comprimento do caminho mais longo da raiz até uma das folhas. A altura de uma árvore com um único nó é 0; A altura da árvore vazia é 1; A raiz está no nível 0 e seus filhos diretos no nível 1, e assim por diante; O último nível é o h (que é a altura da árvore) 35
ÁRVORE CHEIA Árvore é dita cheia se todos os seus nós internos têm 2 sub-árvores associadas e todos os nós folhas estão no último nível. O número total de nós de uma árvore cheia é dado por 2 h+1-1 Uma árvore binária cheia com n nós tem uma altura proporcional a log n 36
ÁRVORE CHEIA 37
ÁRVORE DEGENERADA Árvore é dita degenerada se todos os seus nós internos têm uma única sub-árvore associada. A estrutura hierárquica se degenera em uma estrutura linear Uma árvore degenerada de altura h tem h + 1 nós Altura de uma árvore degenerada com n nós é proporcional a n 38
ÁRVORE DEGENERADA 39
POR QUÊ CALCULAR A ALTURA? A altura de uma árvore é uma medida de avaliação da eficiência com que visitamos os nós de uma árvore Uma árvore binária com n nós tem uma altura mínima proporcional a log n (caso a árvore seja cheia) e uma altura máxima proporcional a n (caso a árvore seja degenerada) A altura indica o esforço computacional necessário para alcançar qualquer nó da árvore; Em árvores binárias de busca, é importante manter a altura pequena, ou seja, manter a árvore com distribuição dos nós próxima à da árvore cheia. 40
POR QUÊ CALCULAR A ALTURA? Exemplo de árvore binária de busca Valor da raiz sempre maior que o da sub-árvore da esquerda e menor que o da sub-árvore da direita Busca de elemento é otimizada 41
FUNÇÃO PARA CÁLCULO DA ALTURA Função auxiliar para calcular o máximo entre dois inteiros Função recursiva para calcular a altura 42
ÁRVORE BINÁRIA DE BUSCA
ÁRVORES DE BUSCA BINÁRIA As árvores de busca binária têm uma propriedade fundamental: o valor associado à raiz é sempre maior que o valor associado a qualquer nó da sub-árvore à esquerda (sae), e é sempre menor que o valor associado a qualquer nó da sub-árvore à direita (sad). Essa propriedade garante que, quando a árvore é percorrida em ordem infixada (sae - raiz - sad), os valores são encontrados em ordem crescente. 44
ÁRVORE DE BUSCA BINÁRIA 45
INTRODUÇÃO Para procurar um valor numa árvore, comparamos o valor que buscamos com o valor associado à raiz. Em caso de igualdade o valor foi encontrado; Se o valor procurado for menor que o valor da raiz a busca continua na sae; Se o valor procurado for maior que o valor da raiz a busca continua na sad. 46
TIPO DA ÁRVORE BINÁRIA 47
OPERAÇÃO DE BUSCA 48
OPERAÇÃO DE INSERÇÃO 49
OPERAÇÃO DE REMOÇÃO Essa operação é um pouco mais complexa que a de inserção. Existem três situações possíveis. A primeira é quando se deseja retirar um elemento que é folha da árvore. A segunda situação acontece quando o nó a ser retirado possui um único filho. A terceira situação ocorre quando o nó a ser retirado tem dois filhos. 50
OPERAÇÃO DE REMOÇÃO- 1ª E 2ª SITUAÇÕES 51
OPERAÇÃO DE REMOÇÃO- 1ª E 2ª SITUAÇÕES A primeira, e mais simples, é quando se deseja retirar um elemento que é folha da árvore. Neste caso, basta retirar o elemento da árvore e atualizar o pai, pois seu filho não existe mais. A segunda situação, ainda simples, acontece quando o nó a ser retirado possui um único filho. Para retirar esse elemento é necessário antes acertar o ponteiro do pai, pulando o nó: o único neto passa a ser filho direto. 52
OPERAÇÃO DE REMOÇÃO - 3ª SITUAÇÃO Localiza o nó a ser eliminado (nó 6) Encontra o nó mais a direita da sub-árvore da esquerda (nó 4) Trocar os valores entre o nó a ser eliminado e o nó encontrado. Localiza novamente o nó a ser eliminado (nó 6) 53
OPERAÇÃO DE REMOÇÃO - 3ª SITUAÇÃO Para poder retirar esse nó da árvore, devemos proceder da seguinte forma: encontramos o elemento que precede o elemento a ser retirado na ordenação. Isto equivale a encontrar o elemento mais à direita da sub-árvore à esquerda; trocamos a informação do nó a ser retirado com a informação do nó encontrado; retiramos novamente o nó encontrado (que agora contém a informação do nó que se deseja retirar). Observa-se que retirar tal nó agora é trivial, pois esse é um nó folha ou um nó com um único filho. 54
OPERAÇÃO DE REMOÇÃO 3ª SITUAÇÃO 55
OPERAÇÃO DE REMOÇÃO 3ª SITUAÇÃO 56
OPERAÇÃO DE REMOÇÃO 3ª SITUAÇÃO 57