05 Arvore
05 Arvore
05 Arvore
Árvores
Nós com filhos são comumente chamados de nós internos, e nós que não têm filhos são chamados
de folhas ou nós externos. É tradicional desenhar as árvores com a raiz para cima e as folhas para
baixo.
1
Árvores binárias: uma árvore binária é um caso
especial de árvore em que um pai tem, no máximo,
dois filhos (zero, um ou dois). Assim,
recursivamente, os filhos são pais que têm, no
máximo, dois filhos. O uso da árvore binária é o
mais difundido, e muitas vezes a adotamos sem
saber que a estamos utilizando. Quando
efetuamos: montamos
uma árvore binária da seguinte forma:
Numa árvore binária, quando um nó tem ramificações, cada uma delas recebe um nome. A
ramificação esquerda receberá o nome de Subárvore Esquerda (SAE), e a ramificação direita será a
Subárvore Direita (SAD).
2
Mesmo tendo duas informações iguais, uma árvore que tem uma informação na SAE e outra que
tem a mesma informação na SAD são diferentes:
Percurso em árvores binárias: a posição da informação nas subárvores é importante, pois, muitas
vezes, precisamos percorrer uma árvore para buscar informação, ou mesmo para descrevê-la. Ao
percorrer uma árvore, precisamos ter um critério, pois não podemos tomar um caminho qualquer,
sob o risco de passarmos e colhermos informação de um mesmo nó.
Dentro de uma árvore, o conceito de recursividade torna-se fundamental, pois, em árvores grandes,
dificilmente teríamos duas subárvores iguais e, portanto, não podemos antever uma sequência fixa
de operações.
3
O percurso completo resulta: 1 2 3 4 5 6 7 8.
Percurso em pós-ordem ou posfixo:
4
a) A B C D E F H I
b) E B H A C F I D
c) A B C D E F G H
d) A D C B F I H E
e) E D B H A C F I
5
Fazendo a busca do número 2:
Estrutura linear:
Estrutura em árvore
Operação de busca
Na busca, as seguintes operações devem ser realizadas recursivamente, lembrando que a cada
movimentação, o novo nó passa a ser a raiz:
6
se o valor procurado for igual ao da raiz, o valor será encontrado;
se o valor procurado for menor que o da raiz, deveremos buscar na SAE;
se o valor procurado for maior que o da raiz, deveremos buscar na SAD;
Se o nó for folha da árvore, o valor requerido não terá sido encontrado.
Operação de inserção
Deve ser feita com bastante critério, pois o novo valor inserido não pode quebrar a estrutura da
árvore, mas é bem simples, uma vez entendida a operação de busca. Fazemos a operação de
busca; ao encontrarmos uma subárvore livre ou uma folha, devemos obedecer ao seguinte critério:
se a chave a ser inserida for menor que a chave do nó analisado, inseriremos a chave na
subárvore esquerda;
se a chave a ser inserida for maior que a chave do nó analisado, inseriremos a chave na
subárvore direita;
se a subárvore estiver ocupada, seguiremos com a busca
7
Inserir o valor 88:
Operação de remoção
Fazer a remoção de um nó sem comprometer a estrutura é um processo mais complexo. Para
excluir um nó de uma árvore binária de busca, devemos considerar três situações:
remoção na folha;
remoção de um nó com um filho;
remoção de um nó com dois filhos.
Remoção de folha
basta remover o
nó da árvore
8
Excluímos o nó, e
o filho sobe para a
posição do pai.
Remoção de folha
com dois filhos
(primeira forma):
substituímos o valor
do nó a ser retirado
pelo nó mais à
direita da subárvore
esquerda.
Remoção de folha
com dois filhos
(segunda forma):
substituímos o valor
do nó a ser retirado
pelo nó mais à
esquerda da
subárvore direita.
9
Em uma árvore binária cada nó tem no máximo
duas “subárvores”, e quando há somente um
presente é necessário distinguir entre “subárvore”
esquerda e direita. Formalmente uma árvore binária
pode ser definida como um conjunto finito de nós,
que é vazio, ou consiste em um nó raiz e dois
conjuntos disjuntos de nós, a “subárvore” esquerda
e a “subárvore” direita.
Podemos numerar os nós de uma árvore binária
cheia da seguinte forma: começamos a partir da
raiz e "descemos" para o nível 1 depois o nível 2,
nível 3 etc. Os nós em qualquer nível são
numerados da esquerda para direita. A figura
abaixo apresenta uma árvore binária cheia com a
enumeração correspondente.
package arvore;
10
class ArvoreBinaria{
public static void main(String[] args){
BArvore arvore1 = new BArvore ();
arvore1.inserirNo (14);
arvore1.inserirNo (16);
arvore1.inserirNo (12);
arvore1.inserirNo (11);
arvore1.inserirNo (17);
arvore1.inserirNo (15);
arvore1.inserirNo (10);
arvore1.inserirNo (13);
arvore1.exibirNo ();
arvore1.excluirNo (12);
System.out.println ("");
arvore1.exibirNo ();
}
}
package arvore;
class BArvore{
private BIntNo Raiz;
11
pai = tempNo;
if (item < tempNo.valor)
tempNo = tempNo.esq;
else
tempNo = tempNo.dir;
}
if (tempNo == null)
System.out.println ("Item nao localizado.");
if (pai == null){
if (tempNo.dir == null)
Raiz = tempNo.esq;
else if (tempNo.esq == null)
Raiz = tempNo.dir;
else{
for (temp = tempNo, filho = tempNo.esq;
filho.dir != null; temp = filho, filho = filho.dir);
if (filho != tempNo.esq){
temp.dir = filho.esq;
filho.esq = Raiz.esq;
}
filho.dir = Raiz.dir;
Raiz = filho;
}
}else if (tempNo.dir == null){
if (pai.esq == tempNo)
pai.esq = tempNo.esq;
else
pai.dir = tempNo.esq;
}else if (tempNo.esq == null){
if (pai.esq == tempNo)
pai.esq = tempNo.dir;
else
pai.dir = tempNo.dir;
}else{
for (temp = tempNo, filho = tempNo.esq;
filho.dir != null; temp = filho, filho = filho.dir);
if (filho != tempNo.esq){
temp.dir = filho.esq;
filho.esq = tempNo.esq;
}
filho.dir = tempNo.dir;
if (pai.esq == tempNo)
pai.esq = filho;
else
pai.dir = filho;
}
}catch (NullPointerException erro){
//Item nao encontrado
}
}
}
12
package arvore;
class BIntNo{
int valor;
BIntNo esq, dir;
Exercícios:
1) Altere o exemplo apresentado anteriormente, sobre a teoria de árvore binária,
para que tenha um Menu para Inserir, Excluir e Sair. As informações deverão ser
inseridas pelo usuário.
2) Estude e fale sobre os algoritmos de inclusão e alteração. Conceito raiz e folha. E
como funciona uma arvore binária balanceada.
3) Alterar o algoritmo para dependo da escolha do usuário exibir a árvore em pré-
ordem, pós-ordem e em ordem.
13