Árvores
Bruno Silva
Contexto
• Árvore, no contexto da programação e ciência
da computação, é uma estrutura de dados que
herda as características das topologias em
árvore.
• Servem para criação de estruturas
hierárquicas.
• Exemplo estrutura de diretórios do
computador.
Conceitos básicos
• Uma árvore é composta de um conjunto finito de
Nós.
• Desse conjunto, há um nó r denominado de raiz, que
contém zero ou mais sub-árvores, cujas raízes são
ligadas diretamente a r.
• Esses nós raízes das sub-árvores são ditos filhos do
nó pai, r.
• Nós com filhos são chamados de nós
internos.
• Nós que não têm filhos são chamados de nós
externos (folhas).
Propriedades
• Existe um único caminho da raiz para
qualquer nó da árvore.
• Portanto, podemos definir a altura da árvore
como sendo o comprimento do caminho mais
longo da raiz até uma das folhas.
• A altura de uma árvore que possui somente
um elemento é zero.
Árvore Binária
• Constituida por dois nós
– SAD: Sub árvore direita.
– SAE: Sub árvore esquerda.
class Arvore{
Object objeto;
Arvore sae;
Arvore sad;
};
//Esse objeto pode ser de qualquer tipo
Principais Funções
•
•
•
•
Inserir.
Remover.
Consultar.
Varrer elementos.
– Pré-ordem
– Em-odem
– Pós-ordem
Percorrendo uma árvore.
• 3 tipos de percurso
– Pré-Ordem: tratar raiz, percorrer sae, percorrer
sad;
– Em-Ordem : percorrer sae, tratar raiz, percorrer
sad;
– Pós-Ordem: percorrer sae, percorrer sad, tratar
raiz.
Pré-Ordem
• Imprima os valores presentes nos
nós da árvore ao lado em pré
ordem.
A
B
C
public void preOrdem(ArvoreNo no) {
if(no != null){
System.out.print(no.getInfo()+" ");
preOrdem(no.getNoE());
preOrdem(no.getNoD());
}
}
Resultado: A, B,C, D, E, F, G, H, I, J, K, L
I
D
E
J
H
F
G
K
L
Pós-Ordem
• Imprima os valores presentes nos
nós da árvore ao lado em pós
ordem.
A
B
public void posOrdem(ArvoreNo no) {
if(no != null){
posOrdem(no.getNoE());
posOrdem(no.getNoD());
System.out.print(no.getInfo()+" ");
}
}
Resultado: C, G, F, E, H, D, B, K, L, J, I, A
C
I
D
E
J
H
F
G
K
L
Em-Ordem
• Imprima os valores presentes nos
nós da árvore ao lado em ordem.
A
B
public void emOrdem(ArvoreNo no) {
if(no != null) {
emOrdem(no.getNoE());
System.out.print(no.getInfo()+" ");
emOrdem(no.getNoD());
}
}
Resultado: C, B, F, G, E, D, H, A, I, K, J, L
C
I
D
E
J
H
F
G
K
L
Consulta de nós (1)
• Consulta com sucesso.
• Exemplo: Na ABP abaixo, consultar os dados referenciados
pelo nó de valor 3.
4
4
1
6
3
2
5
1
7
3
Consulta de nós (2)
• Consulta sem sucesso.
• Exemplo: Na ABP abaixo, consultar os dados referenciados
pelo nó de valor 9.
4
4
1
6
3
2
5
6
7
7
Inserção de nós (1)
• A ordem em que os valores são inseridos é relevante.
– Exemplo 1: Inserir os nós 13 e 15.
– Exemplo 2: Inserir os nós 15 e 13.
raiz 10
raiz 10
2
1
8
3
7
2
12
9
16
4
16
4
1
11
8
3
7
12
9
11
13
15
15
13
Algoritmo de Inserção
public void Inserir(No novo, No anterior){
if (anterior != null){
if (novo.ObtemValor() < anterior.ObtemValor())
inicio.filho_Esq=this.Insere(novo, anterior.filho_Esq
else
if(novo.ObtemValor()>anterior.ObtemValor())
anterior.p_Dir=this.Insere(filho, anterior.filho_Dir
else
return;
}else
anterior = novo;
}
Inserção de nós (2)
• Exemplo: Construir uma ABP a partir da seguinte lista de valores:
5,2,7,6,4,3 e 8.
5
2
7
4
3
6
8
Remoção de nós – Caso 1
• Caso 1: nodo a ser removido tem zero filhos
– Apenas remove o nodo (Remover 3)
5
5
2
4
3
2
7
6
8
7
4
6
8
Remoção de nós – Caso 2
• Caso 2: no a ser removido tem um filho
–
Substitui o nó por seu filho
5
5
10
2
4
3
10
2
13
6
12
4
3
6
12
Remoção de nós – Caso 3
• Caso 3: Nó a ser removido tem dois filhos
–
Substitui o nó por seu sucessor
raiz 11
raiz 11
17
5
9
3
2
4 8
9
3
13
10
17
8
2
4
13
10
Após a remoção
Nó sucessor
• Considerando que as chaves sejam todas
distintas:
• O sucessor de um nodo x é o nodo y, tal que
chave[y] é o menor valor maior que chave[x].
Download

Árvores