Árvores - instituto de física da ufrgsthielo/arvores1.pdf · Árvores um conjunto finito de...
TRANSCRIPT
ÁRVORESUtilizadas 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
ÁRVORESum conjunto finito de elementos ondeum elemento é chamado de raiz
os outros são divididos em subconjuntos disjuntos, onde cada um define uma árvorecada elemento é um nó ou vértice da árvore
arcos ou arestas conectam os vértices
4
ÁRVORESuma coleção não vazia de vértices e ramos que satisfazem a certos requisitosvé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
TERMINOLOGIA E PROPRIEDADESCada vértice (exceto a raiz) tem exatamente um antecessor imediato ou paiCada 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ãosNós com pelo menos um filho : não-terminais ou internos
8
TERMINOLOGIA E PROPRIEDADEScaminho em uma árvore:é uma lista de vértices distintos e sucessivos, conectados por arcos (arestas) da árvore
nó raizexiste exatamente um caminho entre a raiz e cada um dos nós da árvorese existir mais de um caminho ou nenhum grafo
9
TERMINOLOGIA E PROPRIEDADESgrau é 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
ÁRVORESA única diferença entre as duas árvores é a ordem das sub-árvoresUma á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
13
E F
B
G H I
C
L M
O
S
P Q R
N
K
J
D
A
nível da raiz é zero
nível de C é 1
nível de K é 3
nível de um nó = nível de seu pai + 1
nível de P é 5
TERMINOLOGIAAltura 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
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
VANTAGENSPossuem um número constante de sub-árvores em cada nóLimitação do número de ponteiros usados
Algoritmos eficientes para o tratamentoA 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
OPERAÇÕES BÁSICAS DA ÁRVORE BINÁRIA (INTERFACE DO TIPO ÁRVORE)Criar uma árvore vaziaCriar uma árvore não vaziaVerificar se a árvore está vaziaVerificar se um elemento pertence a árvoreLiberar uma árvoreImprimir os nós da árvore
19
IMPLEMENTAÇÃO DE ÁRVORES BINÁRIASO acesso a uma árvore se dará através de um ponteiro para o nó raizA 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 direitaFunções são implementadas utilizando definição recursiva da estrutura 20
IMPLEMENTAÇÃO DE ÁRVORES BINÁRIAS
21
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;}
IMPLEMENTAÇÃO DE ÁRVORES BINÁRIASFunção que libera a estrutura da árvore
Função que verifica se uma árvore está vazia
23
CRIAÇÃO E LIBERAÇÃONote 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ÁRIASA busca nada mais é do que um percurso em uma árvoreO percurso em uma árvore visitando cada nó uma única vez gera uma seqüência linear de nósAssim, passa a ter sentido falar em sucessor e predecessor de um nó segundo um determinado percursoHá 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É-ORDEMAlgoritmo 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 ÁRVOREPropriedade Fundamental de ÁrvoresSó 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 2h+1- 1Uma árvore binária cheia com n nós tem uma altura proporcional a log n
36
Á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 linearUma árvore degenerada de altura h tem h + 1 nósAltura de uma árvore degenerada com n nós é proporcional a n
38
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 árvoreUma á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 buscaValor 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 ALTURAFunção auxiliar para calcular o máximo entre dois inteiros
Função recursiva para calcular a altura
42
ÁRVORES DE BUSCA BINÁRIAAs á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
INTRODUÇÃOPara procurar um valor numa árvore, comparamos o valor que buscamos com o valor associado à raiz.Em caso de igualdadeo valor foi encontrado;
Se o valor procurado for menor que o valor da raiza busca continua na sae;
Se o valor procurado for maior que o valor da raiza busca continua na sad.
46
OPERAÇÃO DE REMOÇÃOEssa 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 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