Você está na página 1de 20

ÁRVORES

Definição

Uma árvore T (tree) é um conjunto finito de N estruturas elementares, chamados nodos (nós), tal que se N > 0, então:

1. Existe um nodo especial, chamado raiz da árvore; 2. Os restantes N1 nodos estão particionados em

, S M , onde cada

um destes conjuntos é também uma árvore. As

, S M são chamadas sub-árvores

M conjuntos disjuntos: S 1 , S 2 ,

árvores S 1 , S 2 ,

de T.

Árvores são estruturas de dados não sequênciais extremamente úteis em muitas aplicações.

Árvores são estruturas de dados que caracterizam uma relação entre os dados que a compõem.

A relação existente entre os nodos é uma relação de hierarquia, onde um conjunto de nodos é hierarquicamente subordinado a outro.

Formas de Representação Gráfica

Grafo (representação mais utilizada)

Gráfica • Grafo (representação mais utilizada) • Diagrama de Venn (ou digrama de inclusão) •

Diagrama de Venn (ou digrama de inclusão)

utilizada) • Diagrama de Venn (ou digrama de inclusão) • Identação A B C D E

Identação

A

B

C

D

E

F

G

Parênteses Aninhados

(A (B(D, E, F), C(G)))

Terminologia

A raiz de uma árvore é chamada de pai de suas sub- árvores.

Nodos com o mesmo pai são denominados irmãos.

O grau de um nodo é por definição o número de sub- árvores do nodo.

O grau da árvore é grau máximo entre todos os nodos.

Um nodo folha (terminal ou externo) tem grau zero, ou seja, não tem sub-árvores.

O nodo raiz tem nível 0, os nodos filhos da raiz têm nível 1 e, assim, sucessivamente.

A altura de uma árvore é igual ao número de níveis desta árvore. Um nodo folha tem altura unitária.

Um conjunto de árvores disjuntas forma uma floresta.

Raiz Arestas Nível 1 Grau 3 Nível 2 Nodos folhas
Raiz
Arestas
Nível 1
Grau 3
Nível 2
Nodos folhas

Árvores Binárias

São árvores cujos nodos possuem grau 0, 1 ou 2, ou seja têm no máximo 2 sub-árvores, denominadas:

sub-árvore esquerda (E)

sub-árvore direita (D).

Árvores

binárias

combinam

as

vantagens

de

2

estruturas:

Vetor ordenado (busca eficiente)

Lista encadeada (inserção e exclusão eficientes)

Estrutura de dados:

tipo ArvBin = ^TArvBin

TArvBin = registro

Chave : inteiro {caracter, string, etc.}

E

: ArvBin

{sub-árvore esquerda}

D

: ArvBin

{sub-árvore direita}

{outros campos específicos da aplicação} fim

Percurso em Árvores Binárias

1 Percurso em Pré-Ordem (R, E, D) Percorre-se

a raiz;

a sub-árvore esquerda, em pré-ordem; e

a sub-árvore direita, em pré-ordem.

4 2 6 1 3 5 7 4 2 1 3 6 5 7
4
2
6
1
3
5
7
4
2
1
3
6
5
7

procedimento Pre_ordem(T : ArvBin) inicio se T Nulo então inicio Processa(T) Pre_ordem(T^.E) Pre_ordem(T^.D) fim

fim

Percurso em Árvores Binárias

2. Percurso In-Ordem (E, R, D) Percorre-se:

a sub-árvore esquerda, in-ordem;

a raiz; e

sub-árvore direita, em in-ordem.

4 2 6 1 3 5 7 1 2 3 4 5 6 7
4
2
6
1
3
5
7
1
2
3
4
5
6
7

procedimento In_ordem(T : ArvBin) inicio se T Nulo então inicio In_ordem(T^.E) Processa(T) In_ordem(T^.D) fim fim

Percurso em Árvores Binárias

3 Percurso em Pós-Ordem (E, D, R) Percorre-se:

a sub-árvore esquerda, em pós-ordem;

a sub-árvore direita, em pós-ordem; e

a raiz.

4 2 6 1 3 5 7 1 3 2 5 7 6 4
4
2
6
1
3
5
7
1
3
2
5
7
6
4

procedimento Pos_ordem(T : ArvBin) inicio se T Nulo então inicio Pos_ordem(T^.E) Pos_ordem(T^.D) Processa(T) fim

fim

Percurso em Árvores Binárias

4 Percurso em Nível

Percorre-se a árvore de cima para baixo e da direita para a esquerda:

procedimento EmNível(T: ArvBin) declare F : Fila início se T nulo então início Inicializa(F) InsereNaFila(F, T) enquanto FilaVazia(F) = falso faça início T RetiraDaFila(F) Processa(T) se T^.E nulo então InsereNaFila(F, T^.E) se T^.D nulo então InsereNaFila(F, T^.D)

fim

Finaliza(F)

fim

fim

4 2 6 1 3 5 7 4 2 6 1 3 5 7
4
2
6
1
3
5
7
4
2
6
1
3
5
7

Classificação de Árvores Binárias

Árvore Estritamente Binária:

É uma A.B. na qual todo nodo tem 0 ou 2 sub- árvores, ou seja, nenhum nodo tem “filho único”.

Binária: É uma A.B. na qual todo nodo tem 0 ou 2 sub- árvores, ou seja,

Classificação de Árvores Binárias

Árvore Binária Cheia É uma A.B. na qual todos os nodos, exceto os do último nível, têm exatamente duas sub-árvores.

Uma árvore binária cheia de altura h nodos.

tem

2 h -1

os do último nível, têm exatamente duas sub-árvores. Uma árvore binária cheia de altura h nodos.

Classificação de Árvores Binárias

Árvore Binária Completa É uma árvore estritamente binária (nodos com grau 0 ou 2), na qual os nodos folhas podem estar apenas no último ou no penúltimo nível.

binária (nodos com grau 0 ou 2), na qual os nodos folhas podem estar apenas no

Classificação de Árvores Binárias

Árvore Binária de Pesquisa (ou A.B. Ordenada) É aquela na qual todo nodo tem chave maior que o filho esquerdo e menor que o seu filho direito Uma árvore binária de pesquisa só admite uma ocorrência de cada chave.

4 2 8 1 3 6 9 5 7
4
2
8
1
3
6
9
5
7
C B E A D G F
C
B
E
A
D
G
F

Classificação de Árvores Binárias

Árvore Binária Balanceada (ou Árvore AVL)

É aquela na qual as alturas das sub-árvores E e D de qualquer nodo diferem de no máximo 1 (um).

Essa diferença é chamada fator de balanceamento do nodo. Logo, numa AVL o fator de balanceamento de qq nodo pode se -1, 0 ou 1.

AVL = (Adelson-Velskii e Landis, 1962)

nodo. Logo, numa AVL o fator de balanceamento de qq nodo pode se -1, 0 ou
nodo. Logo, numa AVL o fator de balanceamento de qq nodo pode se -1, 0 ou

Inserção em Árvores de Pesquisa

Seja K a chave a ser inserida e T um ponteiro para a raiz de uma árvore de pesquisa. Se T = nulo a árvore está vazia e o novo nodo se

tornará a raiz da árvore Se T nulo, então 3 situações podem ocorrer:

1. K < T^.Chave: o novo nodo só poderá ser criado e inserido na sub-árvore esquerda de T, T^.E. Compara- se novamente K com T^.E^.Chave e as mesmas três situações podem ocorrer.

2. K = T^.Chave: o novo nodo não poderá ser criado e inserido, pois uma árvore binária de pesquisa só admite uma ocorrência de cada chave.

3. K > T^.Chave: o novo nodo só poderá ser criado e inserido na sub-árvore direita de T, T^.D, Então K é comparada com T^.D^.Chave, sendo possíveis as três situações descritas.

Algoritmo para inserção em AP

função Ins_ArvBinPesq(PorRef T : ArvBin; K : Inteiro) : lógico

início se T = nulo então início T CriaNodo {aloca memória para um novo nodo} T^.Chave K retorne verdadeiro fim senão início se K < T^.Chave então retorne Ins_ArvBinPesq(T^.E, K) senão se K = T^.Chave então retorne falso senão retorne Ins_ArvBinPesq(T^.D, K)

fim

fim

Exclusão em Árvores de Pesquisa

A exclusão de um nodo T em uma árvore de pesquisa envolve a análise de casos possíveis:

1. T é um nodo folha: basta "destruir" T e fazê-lo apontar para nulo.

2. T possui apenas um nodo filho: basta "destruir" T e fazê-lo apontar para o seu nodo filho.

3. T possui dois nodos filhos: para manter a árvore ordenada, há duas alternativas:

substituir o conteúdo de T pelo conteúdo do nodo antecessor (o mais à direita de T^.E).

substituir o conteúdo de T pelo conteúdo do nodo sucessor (o mais à esquerda de T^.D).

Neste 3 o caso, o nodo removido (“destruído”) é o nodo antecessor ou o nodo sucessor, cuja remoção sempre leva ao casos 1 ou ao caso 2.

Algoritmo para exclusão em AP

função ExcluiNodo_ArvBinPesq(PorRef T: ArvBin; K: inteiro) : lógico

declare N: ArvBin início se T = nulo então retorne falso se K = T^.Chave então início

{Abandona sem fazer nada}

{chave encontrada!}

N T

se T^.E = nulo então

T T^.D senão se T^.D = nulo então {T tem apenas o filho esquerdo}

{T pode ter apenas o filho D}

T T^.E

senão

{T tem 2 filhos }

início

N Antecessor(T^.E) {acha o nodo antecessor }

T^.K N.K fim destroi(N)

{substitui o conteúdo de T pelo de N}

{libera os recursos alocados para N}

retorne verdadeiro fim senão se K < T^.Chave então retorne ExcluiNodo_ArvBinPesq(T^.E, K) senão retorne ExcluiNodo_ArvBinPesq(T^.D, K)

fim

função Antecessor(PorRef X : ArvBin) : ArvBin declare r : ArvBin início se X^.D = nulo então {X é o nodo mais à direita} início

r

X

X

X^.E

retorne r

fim

senão

{desce mais um nível, pela direita}

retorne Antecessor(X^.D)

fim

Árvores Balanceadas (ou AVL)

AVL = (Adelson-Velskii e Landis, 1962)

Em uma árvore balanceada as alturas das sub-árvores E e D de qualquer nodo N diferem de no máximo 1 (um).

Essa diferença é chamada fator de balanceamento:

FB(N) = Altura(N^.D) – Altura(N^.E)

Portanto,

Se FB (N) = 0,

Se FB (N) > 0,

Se FB(N) < 0,

as duas sub-árvores têm a mesma altura.

a sub-árvore direita é mais alta que a esquerda.

a sub-árvore esquerda é mais alta que a direita;

Em uma AVL, |FB(N)| 1 para todos os nodos

A altura máxima de uma AVL é no máximo 45% maior que uma árvore perfeitamente balanceada.

Inserção numa árvore AVL

A inserção de um novo nodo é feita exatamente como numa árvore de pesquisa convencional.

Se esta inserção implicar em |FB| > 1 para algum(s) ancestral(ais) do nodo inserido, o desequilíbrio é corrigido através de rotação de nodos.

Rotações Simples:

Pai e Filho têm desequilíbrio para o mesmo lado, ou fatores de balanço com o mesmo sinal.

Rotação à Direita

RotDir

P

Pai(N) {pai do nodo}

F

P^.E

{filho esquerdo}

se P Nulo então

P^.E F

N^.E F^.D F^.D N

03 -2 02 -1
03 -2
02 -1
02 0 01 0 03
02
0
01
0
03
F N^.E ← F^.D F^.D ← N 03 -2 02 -1 02 0 01 0 03

01

0

0

 

N

F

Rotação à Esquerda

 

RotEsq

 
 

P

Pai(N) {pai do nodo}

01

+2

F

P^.D

{filho direito}

 

se P Nulo então

 

02

+1

P^.D F

 
 

03

0

0

  02 +1 P^.D ← F     03 0 0 02 0 01 0 03
02 0 01 0 03
02
0
01
0
03
  02 +1 P^.D ← F     03 0 0 02 0 01 0 03

N^.D F^.E F^.E N

N F

Rotações Duplas:

(2 rotações simples, cada uma para um lado)

Pai e Filho têm desequilíbrio para lados opostos, ou fatores de balanço com sinais opostos.

Dupla Rotação à Direita

03 -2 01 +1 02 0
03 -2
01 +1
02
0
03 -2 02 -1 02 0 01 0 01 0 03
03 -2
02 -1
02
0
01
0
01
0
03

0

DupRotDir

RotEsq(N^.E)

RotDir(N)

Dupla Rotação à Esquerda

DupRotDir

01 +2 03 -1 02 0
01 +2
03 -1
02
0
01 +2 02 +1 03
01 +2
02 +1
03

0

02 0 01 0 03
02
0
01
0
03

RotDir(N^.D)

RotEsq(N)

0