Post on 18-Sep-2014
description
Árvores Centro de Informá-ca Universidade Federal de Pernambuco Sistemas de Informação Vinicius Cardoso Garcia vcg@cin.ufpe.br
© 2011 – Vinicius Cardoso Garcia
O que é uma árvore? • Na ciência da computação,
uma árvore é um modelo abstrato de uma estrutura hierárquica
• Uma árvore consiste de nós com uma relação de parentesco
• Aplicações: – Organiza-onal charts – Sistemas de arquivos – Ambientes de programação
Algoritmos e Estrutura de Dados Árvores © 2011 – Vinicius Cardoso Garcia
2
Computers”R”Us
Sales R&D Manufacturing
Laptops Desktops US Interna-onal
Europe Asia Canada
Árvores • Vetores e Listas são ó-mos para representar estrutura de dados lineares, mas não para modelar dados hierárquicos
• Exemplos de dados hierárquicos: sistema de arquivos de um computador
• Uma árvore é uma estrutura de dados recursiva que permite representar dados dispostos de maneira hierárquica.
Algoritmos e Estrutura de Dados Árvores © 2011 – Vinicius Cardoso Garcia
3
Definição de Árvore • Uma árvore écomposta por um conjunto de nós
• Existe um nó raiz que contém zero ou mais sub-‐árvores, cujas raízes(nós internos) estão ligadas diretamente àraiz.
• Os nós que não têm filhos são chamados de folhas (nós externos)
Algoritmos e Estrutura de Dados Árvores © 2011 – Vinicius Cardoso Garcia
4
Definição de Árvore • Ou seja, uma árvore é uma coleção de n ≥ 0 nós, onde – Se n=0, a árvore é dita nula – Se n > 0, a árvore tem as seguintes caracterís-cas:
• O nó inicial é chamado de raiz (root) • Os demais nós são par-cionados em T1, T2, ..., Tk estruturas disjuntas de árvores • As estruturas T1, T2, ..., Tk denominam-‐se sub-‐ árvores
Algoritmos e Estrutura de Dados Árvores © 2011 – Vinicius Cardoso Garcia
5
Exemplo de Árvore • Sistema de arquivos
Algoritmos e Estrutura de Dados Árvores © 2011 – Vinicius Cardoso Garcia
6
C:\
Meus Documentos
Minhas Imagens
Minhas Músicas
Imagem.png
Arquivos de Programas
Java
Exemplo de Árvore • Sistema de arquivos
Algoritmos e Estrutura de Dados Árvores © 2011 – Vinicius Cardoso Garcia
7
C:\
Meus Documentos
Minhas Imagens
Minhas Músicas
Imagem.png
Arquivos de Programas
Java
Sub-‐árvore
Exemplo de Árvore • Sistema de arquivos
Algoritmos e Estrutura de Dados Árvores © 2011 – Vinicius Cardoso Garcia
8
C:\
Meus Documentos
Minhas Imagens
Minhas Músicas
Imagem.png
Arquivos de Programas
Java
Sub-‐árvore Raiz Raiz de
Sub-‐árvore
Folha
Algoritmos e Estrutura de Dados Árvores © 2011 – Vinicius Cardoso Garcia
9
subtree
Terminologia
• Root: node without parent (A) • Internal node: node with at least one
child (A, B, C, F) • External node (a.k.a. leaf ): node
without children (E, I, J, K, G, H, D) • Ancestors of a node: parent,
grandparent, grand-‐grandparent, etc. • Depth of a node: number of ancestors • Height of a tree: maximum depth of
any node (3) • Descendant of a node: child,
grandchild, grand-‐grandchild, etc.
A
B D C
G H E F
I J K
• Subtree: tree consis-ng of a node and its descendants
Profundidade • Profundidade de v é o número de ancestrais de v excluindo o próprio
Algoritmos e Estrutura de Dados Árvores © 2011 – Vinicius Cardoso Garcia
10
Algoritmo depth(T, v); se v é a raiz de T então retorne 0 senão retorne 1 + depth(T, w), onde w são os pais de v em T
Altura • Se v é um nodo externo, então a altura de v é 0 • Em qualquer outro caso, a altura de v é um mais a altura máxima dos
filhos de v
Algoritmos e Estrutura de Dados Árvores © 2011 – Vinicius Cardoso Garcia
11
Algoritmo altura1(T); h <-‐ 0 para cada vér-ce v em T faça se v é um nodo externo de T então h <-‐ Max(h, depth(T, v)) retorne h
Tipos de árvores • Árvores binárias – Cada nó tem no máximo dois filhos
• Árvore com número variável de filhos – Cada nó pode ter vários filhos
Algoritmos e Estrutura de Dados Árvores © 2011 – Vinicius Cardoso Garcia
12
Árvores binárias
• É uma árvores com as seguintes propriedades – Cada nó interno possui ao menos dois filhos (exatamente)
– Um filho de um nó é um par ordenado • Filho a direita e a esquerda
• Aplicações – Expressões aritmé-cas – Processos decisórios – Busca
Algoritmos e Estrutura de Dados Árvores © 2011 – Vinicius Cardoso Garcia
13
A
B C
F G D E
H I
14
Árvores para Expressão AritméJca
• Árvores binárias associada a uma expressão aritmé-ca – Nodos internos: operadores – Nodos externos: operandos
• Exemplo: árvore de expressão aritmé-ca para expressão (2 × (a - 1) + (3 × b))
+
× ×
- 2
a 1
3 b
Algoritmos e Estrutura de Dados Árvores © 2011 – Vinicius Cardoso Garcia
15
Árvore de Decisão
• Árvore binária associada a processos decisórios – Nodos internos: questões com respostas sim ou não – Nodos externos: decisões
• Exemplo: decisão de jantar
Want a fast meal?
How about coffee? On expense account?
Starbucks Spike’s Al Forno Café Paragon
Yes No
Yes No Yes No
Algoritmos e Estrutura de Dados Árvores © 2011 – Vinicius Cardoso Garcia
16
Propriedades de Árvores Binárias
• Notação n número de nodos e número de nodos
externos i número de nodos
internos h altura
" Propriedades: n e = i + 1 n n = 2e - 1 n h ≤ i n h ≤ (n - 1)/2 n e ≤ 2h
n h ≥ log2 e n h ≥ log2 (n + 1) - 1
Algoritmos e Estrutura de Dados Árvores © 2011 – Vinicius Cardoso Garcia
Mais observações • Se uma árvore binária con-ver m nós no nível l, então no nível l+1 conterá no máximo 2m nós – Assim, no nível l uma árvore poderá conter no máximo 2l nós
– Logo, uma árvore binária completa de profundidade d conterá no máximo um total de nós (tn),
Algoritmos e Estrutura de Dados Árvores © 2011 – Vinicius Cardoso Garcia
17
Mais Observações...
!Se uma árvore binária contiver m nós no nível l, então no nível l+1 conterá no máximo 2m nós" Assim, no nível l uma árvore poderá conter no
máximo 2l
" Logo, uma árvore binária completa de profundidade d conterá no máximo um total de nós (tn),
tn#20$2
1$2
2$%$2
d#&
j#0
d
2j
Mais observações • Por indução,
– Assim, também é possível determinar a profundidade da árvore binária dado a quan-dade de nós
Algoritmos e Estrutura de Dados Árvores © 2011 – Vinicius Cardoso Garcia
18
Mais Observações...
! Por indução,
" Assim, também é possível determinar a profundidade da árvore binária dado a quantidade de nós
20#2
0$1%1#1
20$2
1#2
1$1%1#3
20$2
1$2
2#2
2$1%1#7
&
'j#0
d
2j#2
d$1%1
Árvore Completa e Quase-‐Completa • Uma árvore binária é completa quando todos os pais têm dois filhos (esquerdo e direito)
• Uma árvore binária é quase completa quando: – Cada folha da árvore es-ver no nível d ou no nível d-‐1
– Para cada nó nd na árvore com um descendente direito no nível d, todos os descendentes esquerdos de nd que forem folhas es-verem também no nível d.
Algoritmos e Estrutura de Dados Árvores © 2011 – Vinicius Cardoso Garcia
19
Representação de um Nó • Um nodo para uma árvore binária deve conter: – Um campo DADOS – Um ponteiro para o Nó Filho ESQUERDO – Um ponteiro para o Nó Filho DIREITO – Um ponteiro para o Nó PAI
Algoritmos e Estrutura de Dados Árvores © 2011 – Vinicius Cardoso Garcia
20
Representação de um Nodo! Um nodo para uma árvore binária deve conter:
" Um campo DADOS
" Um ponteiro para o Nodo Filho ESQUERDO
" Um ponteiro para o Nodo Filho DIREITO
" Um ponteiro para o Nodo PAI
esq dirpaidados
nodo
Operações Básicas • Existem várias operações possíveis com árvores binárias,
porém as mais comuns são: – info(p): retorna o conteúdo do nó p – esquerdo(p) ou le�(p): retorna o filho esquerdo de p ou None caso não exista filho esquerdo
– direito(p) ou right(p): retorna o filho direito de p ou None caso não exista filho direito
– pai(p) ou father(p): retorna o pai de p ou None caso não exista pai
– irmao(p) ou brother(p): retorna o irmão de p ou None caso não exista irmão
– ehEsquerdo(p) ou isle�(p): retorna TRUE se p é filho esquerdo do seu pai e FALSE caso contrário
– ehDireito(p) ou isright(p): retorna TRUE se p é filho direito do seu pai e FALSE caso contrário
Algoritmos e Estrutura de Dados Árvores © 2011 – Vinicius Cardoso Garcia
21
Operações Básicas • As funções para retorno de filhos esquerdo e direito, pai e conteúdo são triviais: – def getInfo(p): return self.dado – def getLe�(p): return self.esq – def getRight(p): return self.dir – def getFather(p): return self.pai
• Onde p é um ponteiro para um nó da árvore!
• Mas, e as demais funções, como implementá-‐ las?
Algoritmos e Estrutura de Dados Árvores © 2011 – Vinicius Cardoso Garcia
22
Operações Básicas • U-lizando as funções getLe�(p), getRight(p) e getFather(p) é possível escrever as demais funções: – Função isle�(p): é filho esquerdo?
Algoritmos e Estrutura de Dados Árvores © 2011 – Vinicius Cardoso Garcia
23
... !q = getFather(p) !if q == none:! return false; #quando p aponta para raiz if getLeft(q)==p:! return true !return false!
Operações Básicas • Função isright(p): é filho direito?
Algoritmos e Estrutura de Dados Árvores © 2011 – Vinicius Cardoso Garcia
24
...!q = getFather(p) !if q == null:! return false #quando p aponta para raiz!if getRight(q)==p: ! return true!return false!
Operações Básicas • Função brother(p): retorna irmão de p
Algoritmos e Estrutura de Dados Árvores © 2011 – Vinicius Cardoso Garcia
25
...!if getFather(p) == null:!return false #quando p aponta para raiz!if isleft(p): ! return getRight(getFather(p))!return getLeft(getFather(p))!
Exercício de fixação • Ao ler o primeiro número da lista, crie uma árvore binária: – Este número é o nó raiz
• Ao ler o segundo número da lista, compare com a árvore, – Se for igual ao nó atual, temos uma repe-ção; – Se for maior que o nó atual, vá para o filho direito e repita a comparação;
– Se for menor que o nó atual, vá para o filho da esquerda e repita a comparação
Algoritmos e Estrutura de Dados Árvores © 2011 – Vinicius Cardoso Garcia
26
Percorrendo uma Árvore • Operação de percorrer uma árvore: – É o ato de caminhar sobre a árvore enumerando cada um dos seus nós uma vez • É dito visitar um nó a medida que ele é enumerado • Não existe uma ordem natural para se visitar os nós de uma árvore! É possível citar três métodos: – Pré-‐ordem ou profundidade ou caminhamento pré-‐fixado – Em ordem ou ordem simétrica ou caminhamento inter-‐fixado – Pós-‐ordem ou caminhamento pós-‐fixado
Algoritmos e Estrutura de Dados Árvores © 2011 – Vinicius Cardoso Garcia
27
Caminhamento pré-‐fixado • Caminhamento é a visita aos nós de uma
árvore de maneira sistemá-ca • No caminhamento pré-‐fixado, um nó é
visitado antes dos seus decendentes • Aplicação: imprimir a estrutura de um
documento
Algoritmos e Estrutura de Dados Árvores © 2011 – Vinicius Cardoso Garcia
28
Make Money Fast!
1. Mo-va-ons 2. Methods
2.1 Stock Fraud
2.2 Ponzi Scheme 1.1 Greed 1.2 Avidity
1
2
3
5
4 6 7
Algoritmo preOrder(v) visit(v) for each child w of v
preorder (w)
Caminhamento pós-‐fixado • No caminhamento pós-‐fixado, o nó
e visitado após os seus decendentes • Aplicação: calcular o espaço
ocupado por arquivos em um diretório e subdiretórios
Algoritmos e Estrutura de Dados Árvores © 2011 – Vinicius Cardoso Garcia
29
cs16/
homeworks/ programs/
DDR.java 10K
Stocks.java 25K
h1c.doc 3K
h1nc.doc 2K
7
3
1
6
2 4 5
Algoritmo postOrder(v) for each child w of v
postOrder (w) visit(v)
30
Caminhamento interfixado • Em um caminhamento
interfixado um nó é visitado após a sua sub-‐árvore a esquerda e antes da sua sub-‐árvore direita
• Aplicação: desenhe uma árvore binária – x(v) = inorder rank of v – y(v) = depth of v
Algoritmo inOrder(v) if hasLeft (v)
inOrder (left (v)) visit(v) if hasRight (v)
inOrder (right (v))
3
1
2
5
6
7 9
8
4
Algoritmos e Estrutura de Dados Árvores © 2011 – Vinicius Cardoso Garcia
31
• Especialização do caminhamento interfixado – Imprime operando ou operador
quando visita o nó – imprime “(“ antes de caminhar
na subárvore esquerda – imprime “)“ após caminhar na
sub-‐árvore direita
Algorithm printExpression(v) if hasLeft (v)
print(“(’’) inOrder (left(v))
print(v.element ()) if hasRight (v)
inOrder (right(v)) print (“)’’) +
× ×
- 2
a 1
3 b ((2 × (a - 1)) + (3 × b))
Impressão de Expressões AritméJcas
Algoritmos e Estrutura de Dados Árvores © 2011 – Vinicius Cardoso Garcia
32
• Especialização do caminhamento pós-‐fixado – Método recursivo retornando
o valor da sub-‐árvore – Quando visitar um nó interno,
combine o valor das sub-‐árvores
Algorithm evalExpr(v) if isExternal (v)
return v.element () else
x ← evalExpr(leftChild (v)) y ← evalExpr(rightChild (v)) ◊ ← operator stored at v return x ◊ y
+
× ×
- 2
5 1
3 2
Avaliando Expressões AritméJcas
Algoritmos e Estrutura de Dados Árvores © 2011 – Vinicius Cardoso Garcia
AJvidades Complementares • Leitura da seção 10.4 do livro do Cormen
• Implemente uma classe árvore binária
• Implemente a aplicação proposta para avaliação de expressões aritmé-cas – Considere o uso de parênteses
Algoritmos e Estrutura de Dados Árvores © 2011 – Vinicius Cardoso Garcia
33