ÁRVORESif.ufrgs.br/~thielo/arvores1.pdf · 2019-03-25 · sub-árvores. Assim, a função...
Transcript of ÁRVORESif.ufrgs.br/~thielo/arvores1.pdf · 2019-03-25 · sub-árvores. Assim, a função...
ÁRVORES
SUMÁRIOFundamentosÁrvores BináriasÁrvores Binárias de Busca
2
Á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
REPRESENTAÇÃO
6
Á r v o r e
E F
B
G H I
C
L M
O
S
P Q R
N
K
J
C
A
EXEMPLO
7
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
ÁRVORES
11
Á r v o r e ( 1 )
E F
B C
G
D
A
Á r v o r e ( 2 )
C
G
D
E F
B
A
Á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
ÁRVORES BINÁRIAS15
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
VISUALIZAÇÃO DA ÁRVORE BINÁRIA USANDO PONTEIROS
raiz
esq dir
A
B C
E FD
G H I
18
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 verifica se elemento pertence a árvore
22
IMPLEMENTAÇÃO DE ÁRVORES BINÁRIASFunção que libera a estrutura da árvore
Função que verifica se uma árvore está vazia
23
IMPLEMENTAÇÃO DE ÁRVORES BINÁRIASFunçã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 ÁRVOREDada a árvore
Inserir a sub-árvore
A esquerda do nó b
27
LIBERANDO UMA SUB-ÁRVORE NUMA ÁRVOREDada a árvore
Liberar a sub-árvore e
28
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 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 linearUma árvore degenerada de altura h tem h + 1 nósAltura 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 á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
ÁRVORE BINÁRIA DE BUSCA
Á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
ÁRVORE DE BUSCA BINÁRIA
45
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
TIPO DA ÁRVORE BINÁRIA
47
OPERAÇÃO DE BUSCA
48
OPERAÇÃO DE INSERÇÃO
49
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
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