Árvores - Fabrício J. Barth

Transcrição

Árvores - Fabrício J. Barth
Árvores
Fabrı́cio J. Barth
BandTec - Faculdade de Tecnologia Bandeirantes
Setembro de 2011
Disciplina de Estrutura de Dados e Armazenamento
Tópicos
• Introdução
• Árvores binárias
? Implementação em Java
? Ordens de percurso em árvores binárias
? Altura de uma árvore
• Árvores com número váriavel de filhos
? Implementação em Java
? Altura de uma árvore
? Topologia
Árvores —
Tópicos
Faculdade de Tecnologia Bandeirantes 2
Disciplina de Estrutura de Dados e Armazenamento
Introdução - Árvore
Um conjunto de nós tal que:
• existe um nó r, denominado raiz, com zero ou mais
sub-árvores, cujas raı́zes estão ligadas a r.
Árvores —
Introdução - Árvore
Faculdade de Tecnologia Bandeirantes 3
Disciplina de Estrutura de Dados e Armazenamento
• os nós raı́zes destas sub-árvores são os filhos de r.
• os nós internos da árvore são os nós com filhos.
• as folhas ou nós externos da árvore são os nós sem
filhos.
Árvores —
Introdução - Árvore
Faculdade de Tecnologia Bandeirantes 4
Disciplina de Estrutura de Dados e Armazenamento
Árvores Binárias
• uma árvore em que cada nodo tem zero, um ou dois
filhos.
• uma árvore binária é:
? uma árvore vazia, ou;
? um nodo raiz com duas sub-árvores: a sub-árvore
da direita (sad); a sub-árvore da esquerda (sae).
Árvores —
Árvores Binárias
Faculdade de Tecnologia Bandeirantes 5
Disciplina de Estrutura de Dados e Armazenamento
Árvores —
Árvores Binárias
Faculdade de Tecnologia Bandeirantes 6
Disciplina de Estrutura de Dados e Armazenamento
Árvores Binárias - Exemplo
Árvore binária representando expressões aritméticas:
• nós folhas representam operandos
• nós internos operadores
• exemplo: (3 + 6) × (4 − 1) + 5
Árvores —
Árvores Binárias - Exemplo
Faculdade de Tecnologia Bandeirantes 7
Disciplina de Estrutura de Dados e Armazenamento
+
×
5
−
+
3
Árvores —
Árvores Binárias - Exemplo
6
4
1
Faculdade de Tecnologia Bandeirantes 8
Disciplina de Estrutura de Dados e Armazenamento
Árvores binárias - implementação
• A representação de uma árvore é feita através de uma
referência para o nodo raiz da árvore.
• Representação de um nodo da árvore:
1
2
3
4
5
Árvores —
public class Nodo {
private char c;
private Nodo esq;
private Nodo dir;
}
Árvores binárias - implementação
Faculdade de Tecnologia Bandeirantes 9
Disciplina de Estrutura de Dados e Armazenamento
Interface do tipo Árvore
• Nodo criaSemFilhos(char c)
• Nodo criaComFilhos(char c, Nodo esq, Nodo dir)
• boolean vazia(Nodo n)
• boolean pertence(char c, Nodo n)
• void imprime(Nodo n)
Árvores —
Interface do tipo Árvore
Faculdade de Tecnologia Bandeirantes 10
Disciplina de Estrutura de Dados e Armazenamento
Árvores Binárias - implementação
1
2
3
Árvores —
public static Nodo criaSemFilhos(char c) {
return new Nodo(c,null,null);
}
Árvores Binárias - implementação
Faculdade de Tecnologia Bandeirantes 11
Disciplina de Estrutura de Dados e Armazenamento
Árvores Binárias - implementação
1
2
3
4
5
Árvores —
public static Nodo criaComFilhos(char c,
Nodo esq,
Nodo dir) {
return new Nodo(c,esq,dir);
}
Árvores Binárias - implementação
Faculdade de Tecnologia Bandeirantes 12
Disciplina de Estrutura de Dados e Armazenamento
Árvores Binárias - implementação
1
2
3
Árvores —
public static boolean vazia(Nodo n) {
return n == null;
}
Árvores Binárias - implementação
Faculdade de Tecnologia Bandeirantes 13
Disciplina de Estrutura de Dados e Armazenamento
Árvores Binárias - implementação
1
2
3
4
5
6
7
8
Árvores —
public static boolean pertence(char c, Nodo n) {
if(vazia(n))
return false;
else
return c == n.getC() ||
pertence(c,n.getEsq()) ||
pertence(c,n.getDir());
}
Árvores Binárias - implementação
Faculdade de Tecnologia Bandeirantes 14
Disciplina de Estrutura de Dados e Armazenamento
Árvores Binárias - implementação
1
2
3
4
5
6
7
Árvores —
public static void imprime(Nodo n) {
if(!vazia(n)){
System.out.print(n.getC()+" - ");
imprime(n.getEsq());
imprime(n.getDir());
}
}
Árvores Binárias - implementação
Faculdade de Tecnologia Bandeirantes 15
Disciplina de Estrutura de Dados e Armazenamento
Árvores Binárias - exemplo de uso
1
2
3
4
public Main(){
Nodo raiz = ArvoreBinaria.criaComFilhos(’a’,
ArvoreBinaria.criaSemFilhos(’d’),
ArvoreBinaria.criaSemFilhos(’e’));
5
if(ArvoreBinaria.pertence(’f’, raiz))
System.out.println("encontrou");
else
System.out.println("nao encontrou");
6
7
8
9
10
ArvoreBinaria.imprime(raiz);
11
12
Árvores —
}
Árvores Binárias - exemplo de uso
Faculdade de Tecnologia Bandeirantes 16
Disciplina de Estrutura de Dados e Armazenamento
Ordens de percurso em árvores binárias
Árvores —
Ordens de percurso em árvores binárias
Faculdade de Tecnologia Bandeirantes 17
Disciplina de Estrutura de Dados e Armazenamento
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Árvores —
public static void imprimePreOrdem(Nodo n) {
if(!vazia(n)){
System.out.print(n.getC()+" - ");
imprimePreOrdem(n.getEsq());
imprimePreOrdem(n.getDir());
}
}
public static void imprimeInOrdem(Nodo n) {
if(!vazia(n)){
imprimeInOrdem(n.getEsq());
System.out.print(n.getC()+" - ");
imprimeInOrdem(n.getDir());
}
}
public static void imprimePosOrdem(Nodo n) {
if(!vazia(n)){
imprimePosOrdem(n.getEsq());
imprimePosOrdem(n.getDir());
System.out.print(n.getC()+" - ");
}
}
Ordens de percurso em árvores binárias
Faculdade de Tecnologia Bandeirantes 18
Disciplina de Estrutura de Dados e Armazenamento
Exemplos concretos do uso de árvores
• Estrutura de diretórios e arquivos de um sistema
operacional
• Análise semântica de equações matemáticas
• É uma estrutura usada por vários outros algoritmos...
Árvores —
Exemplos concretos do uso de árvores
Faculdade de Tecnologia Bandeirantes 19
Disciplina de Estrutura de Dados e Armazenamento
Altura de árvore binárias
• Propriedade fundamental de árvores: só existe um
caminho da raiz para qualquer nó.
• Altura de uma árvore: comprimento do caminho mais
longo da raiz até uma das folhas.
? a altura de uma árvore com um único nó raiz é zero
? a altura de uma árvore vazia é -1
Árvores —
Altura de árvore binárias
Faculdade de Tecnologia Bandeirantes 20
Disciplina de Estrutura de Dados e Armazenamento
Altura de árvore binárias
• Nı́vel de um nó:
? a raiz está no nı́vel 0, seus filhos diretos estão no
nı́vel 1, ...
? o último nı́vel da árvore é a altura da árvore.
Árvores —
Altura de árvore binárias
Faculdade de Tecnologia Bandeirantes 21
Disciplina de Estrutura de Dados e Armazenamento
Altura de árvore binárias
• Árvore cheia:
? todos os seus nós internos tem duas sub-árvores
associadas.
? número n de nós de uma árvore cheia de altura h é
igual a
n = sk+1 − 1
(1)
Árvores —
Altura de árvore binárias
Faculdade de Tecnologia Bandeirantes 22
Disciplina de Estrutura de Dados e Armazenamento
Altura de árvore binárias
• Árvore degenerada:
? todos os seus nós internos tem uma única
sub-árvore associada.
? número n de nós de uma árvore cheia de altura h é
igual a
n=h+1
(2)
Árvores —
Altura de árvore binárias
Faculdade de Tecnologia Bandeirantes 23
Disciplina de Estrutura de Dados e Armazenamento
Árvores com número variável de filhos
Cada nó pode ter mais que duas sub-árvores associadas.
c:/
temp.txt
arquivos/
program/
aqr1.exe
Árvores —
arq2.exe
Árvores com número variável de filhos
usuarios/
arq3.exe
Faculdade de Tecnologia Bandeirantes 24
Disciplina de Estrutura de Dados e Armazenamento
Árvores com até 3 nós
1
2
3
4
5
Árvores —
public class NodoTernario {
private String conteudo;
private NodoTernario[] filhos =
new NodoTernario[3];
}
Árvores com até 3 nós
Faculdade de Tecnologia Bandeirantes 25
Disciplina de Estrutura de Dados e Armazenamento
Procurando por um elemento
1
2
3
4
5
6
7
8
9
10
11
Árvores —
public static boolean pertence(String c, NodoTernario n)
if(vazia(n)) return false; else{
if (c.equals(n.getConteudo())){
return true;
}else{
NodoTernario [] f = n.getFilhos();
for(int i=0; i<f.length; i++){
if(pertence(c,f[i])){return true;}
}
return false;
}}}
Procurando por um elemento
Faculdade de Tecnologia Bandeirantes 26
Disciplina de Estrutura de Dados e Armazenamento
Árvores com até N nós fixos
1
2
3
4
5
Árvores —
public class NodoTernario {
private String conteudo;
private NodoTernario[] filhos =
new NodoTernario[N];
}
Árvores com até N nós fixos
Faculdade de Tecnologia Bandeirantes 27
Disciplina de Estrutura de Dados e Armazenamento
Representação de árvore com número
variável de filhos
Árvores —
Representação de árvore com número variável de filhos
Faculdade de Tecnologia Bandeirantes 28
Disciplina de Estrutura de Dados e Armazenamento
Funções de uma árvore n-ária
• Nodo create(char c)
• void insert(Nodo a, Nodo sub a)
• void print(Nodo a)
• boolean search(Nodo n, char c)
• int getAltura(Nodo n)
Árvores —
Funções de uma árvore n-ária
Faculdade de Tecnologia Bandeirantes 29
Disciplina de Estrutura de Dados e Armazenamento
Nodo de uma árvore n-ária
1
public class Nodo {
2
private char c;
private Nodo prim;
private Nodo prox;
3
4
5
6
7
Árvores —
}
Nodo de uma árvore n-ária
Faculdade de Tecnologia Bandeirantes 30
Disciplina de Estrutura de Dados e Armazenamento
Criação de nodos em uma árvore n-ária
1
2
3
4
5
6
7
Árvores —
public Nodo create(char c){
Nodo n = new Nodo();
n.setC(c);
n.setPrim(null);
n.setProx(null);
return n;
}
Criação de nodos em uma árvore n-ária
Faculdade de Tecnologia Bandeirantes 31
Disciplina de Estrutura de Dados e Armazenamento
Inserção em uma árvore n-ária
1
2
3
4
5
6
7
8
9
Árvores —
/*
* inseri uma nova sub-arvore como filha
* de um dado no
*/
public void insert(Nodo a, Nodo sub_a){
//inserindo no inicio.
sub_a.setProx(a.getPrim());
a.setPrim(sub_a);
}
Inserção em uma árvore n-ária
Faculdade de Tecnologia Bandeirantes 32
Disciplina de Estrutura de Dados e Armazenamento
Impressão de uma árvore n-ária
1
2
3
4
5
6
Árvores —
public void print(Nodo a){
System.out.println(a.getC());
for(Nodo p = a.getPrim(); p!=null; p=p.getProx()){
print(p); //imprime cada sub-arvore filha
}
}
Impressão de uma árvore n-ária
Faculdade de Tecnologia Bandeirantes 33
Disciplina de Estrutura de Dados e Armazenamento
Busca em uma árvore n-ária
1
2
3
4
5
6
7
8
9
10
11
Árvores —
public boolean search(Nodo n, char c){
if(n.getC()==c){
return true;
}else{
for(Nodo p=n.getPrim(); p!=null; p=p.getProx()){
if(search(p,c))
return true;
}
}
return false;
}
Busca em uma árvore n-ária
Faculdade de Tecnologia Bandeirantes 34
Disciplina de Estrutura de Dados e Armazenamento
Atributos de uma árvore n-ária
1
2
3
4
5
6
7
8
9
Árvores —
public int getAltura(Nodo n){
int hmax = -1; /*caso de arvore sem filhos*/
for(Nodo p=n.getPrim(); p!=null; p=p.getProx()){
int h = getAltura(p);
if(h > hmax)
hmax = h;
}
return hmax + 1;
}
Atributos de uma árvore n-ária
Faculdade de Tecnologia Bandeirantes 35
Disciplina de Estrutura de Dados e Armazenamento
Exemplo de construção e utilização de
uma árvore n-ária
1
2
3
4
5
6
7
8
9
Árvores —
public Main(){
//cria nodos como folha
ArvoreNAria arv = new ArvoreNAria();
Nodo a = arv.create(’a’);
Nodo b = arv.create(’b’);
Nodo c = arv.create(’c’);
Nodo d = arv.create(’d’);
Nodo e = arv.create(’e’);
Nodo f = arv.create(’f’);
Exemplo de construção e utilização de uma árvore n-ária
Faculdade de Tecnologia Bandeirantes 36
Disciplina de Estrutura de Dados e Armazenamento
//monta a hierarquia
arv.insert(a, b);
arv.insert(a, c);
arv.insert(c, d);
arv.insert(a, e);
arv.insert(d, f);
1
2
3
4
5
6
7
arv.print(a);
System.out.println(arv.search(a, ’d’));
System.out.println(arv.search(e, ’d’));
System.out.println(arv.getAltura(a));
8
9
10
11
12
Árvores —
}
Exemplo de construção e utilização de uma árvore n-ária
Faculdade de Tecnologia Bandeirantes 37
Disciplina de Estrutura de Dados e Armazenamento
Topologia Binária
• Representação de um nodo de uma árvore n-ária ≡
representação de um nodo de uma árvore binária.
• Um nodo possui a informação que deve ser
armazenada e duas referências para sub-árvores:
? árvore binária: referências para as sub-árvores à
esquerda e à direita.
? árvore n-ária: referências para a primeira
sub-árvore filha e para a sub-árvore irmã.
Árvores —
Topologia Binária
Faculdade de Tecnologia Bandeirantes 38
Disciplina de Estrutura de Dados e Armazenamento
Resumo
• Árvore binária.
• Árvore com número variável de filhos (n-ária).
Árvores —
Resumo
Faculdade de Tecnologia Bandeirantes 39
Disciplina de Estrutura de Dados e Armazenamento
Material de consulta e referência
• Capı́tulo 13 do livro: “Introdução a Estruturas de
Dados” do Waldemar Celes, Renato Cerqueira e José
Lucas Rangel.
• Imagens retiradas do site da disciplina de
Programação II da PUC do Rio de Janeiro
http://www.inf.puc-rio.br/ inf1007/.
Árvores —
Material de consulta e referência
Faculdade de Tecnologia Bandeirantes 40