Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Árvores
Conceitos sobre Árvores
Servem para representar estruturas hierarquiza-
Notas de aula da disciplina IME 04-10820 das, notadamente Bancos de Dados.
ESTRUTURAS DE DADOS I Def: Uma árvore enraizada T é um conjunto finito
de vértices (nós) tais que:
Paulo Eustáquio Duarte Pinto -T é um conjunto vazio, ou
(pauloedp arroba ime.uerj.br) -existe um nó r (raiz) tal que os demais nós
são particionados em m > 1 conjuntos não
vazios, as subárvores de r e sendo cada um
desses conjuntos uma árvore.
maio/2013
Árvores Árvores
Árvores Árvores
Conceitos Conceitos
A
A
C B E
C B E
D
D
A está no nível 1; D, no nível 3;
A é pai de C, B, E; C é pai de D; A é avô de D;
A altura da árvore é 3;
B é filho de A; D é filho de C; B é tio de D;
O caminho entre A e D tem comprimento 2; entre
B é irmão de C; D é sobrinho de E; D e E, comprimento 3;
1
Árvores binárias Árvores binárias
Exercícios Exercícios
+ +
* - * -
A B C / A B C /
D E D E
Conceitos Conceitos
+ +
* - * -
A B C / A B C /
D E D E
Existe um único caminho entre dois nós de uma árvore. 2h - 1 ≤ n ≤ 2h - 1 ⇒ h = log2 n + 1 = = log2 (n+1)
A árvore binária que representa uma expressão aritmética
é uma árvore estritamente binária com os operandos nas
Altura de uma árvore binária com n nós:
folhas e operadores em nós intermediários.
log2 n + 1 ≤ h ≤ n
2
Árvores binárias Árvores binárias
Representação Percursos
+ +
* - * -
A B C / A B C /
D E D E
le ld -Percurso em nível
chave
-Percurso em pré-ordem
-Percurso in-ordem (ordem simétrica)
Type Arv = ↑No; -Percurso em pós-ordem
No = Record ...
chave: char; le, ld: Arv
End;
Árvores Árvores
D E D E
Percurso em nível: Percurso_nivel;
a idéia é visitar um nível a cada vez, de cima Esvazia Q; Enfila (T);
Enquanto (f ≠ 0):
para baixo e da esquerda para a direita
p ← primeiro elemento da fila;
Visita (p);
↑.le);
Enfila (p↑
+ * - A B C / D E ↑.ld);
Enfila (p↑
p ← Desenfila();
Fe;
Fim;
3
Árvores binárias Árvores binárias
D E D E
Pré-Ordem;
Percurso em pré-ordem: Esvazia P; PUSH (T);
a idéia é visitar, sistematicamente, a raiz, Enquanto (topo ≠ 0):
em seguida toda a subárvore esquerda e depois p ← POP (); Visita (p);
toda a subárvore direita (RED). PUSH (p↑↑.ld);
PUSH (p↑↑.le);
Fe; A
+ * A B - C / D E Fim;
B
+ * A *
+
-
4
Árvores binárias Árvores binárias
Percursos
Exercício
+
+
* -
* -
A B C / A B /
D E
Pré-Ordem; C D
Esvazia P; PUSH (T);
Enquanto (topo ≠ 0): E
p ← POP (); Visita (p);
PUSH (p↑↑.ld);
PUSH (p↑↑.le); Exercício: mostrar a situação da pilha na Busca em
Fe; pré-ordem da árvore acima.
Fim;
+ * A B- C/DE
D E In-Ordem; D E
Percurso em ordem simétrica (in-ordem): Esvazia S; p ← T;
a idéia é visitar, sistematicamente, toda a Enquanto (p ≠ Nulo) Ou (topo ≠ 0):
Enquanto (p ≠ Nulo):
subárvore esquerda, a raiz, e em seguida toda a
PUSH (p); p ← p↑↑.le;
subárvore direita (ERD). Fe;
p ← POP (); Visita (p); p ← p↑↑.ld;
Fe; A
A * B + C - D / E Fim; A *
+
5
Árvores binárias Árvores binárias
Percursos
Exercício +
E * -
B F A B C /
A C I
D E
D H Percurso em pós-ordem:
G a idéia é visitar, sistematicamente, toda a
subárvore esquerda, em seguida toda a subárvore
direita e, por fim, a raiz (EDR).
Exercício: mostrar a situação da pilha na Busca
in-ordem da árvore acima.
A B * C D E / - +
6
Árvores binárias Árvores binárias
Percurso em pós-ordem
+
Exercício
* - +
A B C / * -
Pos-Ordem;
A B /
Esvazia S; p ← T; D E
Enquanto (p ≠ Nulo) Ou (topo ≠ 0):
Enquanto (p ≠ Nulo): C D
PUSH (p, 1); p ← p↑ ↑.le;
Fe; E
Enquanto (p = Nulo) E (topo ≠ 0):
(p, vez) ← POP();
↑.ld ≠ Nulo) Então
Se (vez = 1) e (p↑
PUSH(p, 2); p ← p↑ ↑.ld; Exercício: mostrar a situação da pilha na Busca
Senão em pós-ordem da árvore acima.
Visita (p); p ← Nulo;
Fe;
Fe;
Fim;
A B *C D E / - +
7
Árvores binárias Árvores binárias
Recursão Recursão
Fatorial(p);
É uma técnica de solução de problemas Se (p = 0) Então
(construção de algoritmos) que procura a Retornar 1
solução subdividindo o problema em sub- Senão
problema(s) menor(es), de mesma nature- Retornar p.Fatorial(p-1);
Fim;
za, e compõe a solução desses subproble-
mas, obtendo uma solução do problema ori-
ginal. Fib(p);
Se (p ≤ 1 ) Então
Retornar p
Senão
DIVIDIR PARA CONQUISTAR!!! Retornar Fib(p-1)+Fib(p-2);
Fim;
Recursão Recursão
Visões sobre Recursão: Visões sobre Recursão:
Recursão Recursão
Árvore de recursão para Fatorial
Dinâmica da execução de um procedimento
X ← Fatorial(5) 5
recursivo. 24.5=120
0 1
8
Árvores binárias Árvores binárias
Recursão
Exercício MergeSort em Vetores:
Este é um importante método de ordenação, cuja
idéia recursiva é a seguinte:
Impressão de lista Encadeada
a) Dividir o vetor ao meio e ordenar separadamente cada
um dos subvetores.
Exercício: b) Fazer Merge dos subvetores ordenados.
Escrever um algoritmo recursivo para c) O problema infantil é um subvetor de tamanho igual ou
inferior a 1 quando, para ordená-lo, nda deve ser feito.
imprimir uma lista encadeada em ordem reversa.
V
V1
V2
Merge
Recursão Recursão
MergeSort em Vetores:
MergeSort: exemplo
MergeSort (e, d);
1 2 3 4 5 6
Se (d > e) Então
i ← (e+d)/2; P R I O M G
MergeSort(e, i); MergeSort(i+1, d); P R I O M G
Merge(e, i, d); P R O M
Fim; P O
R M
P R M O
O algoritmo de Merge a ser usado é aquele baseado em 3 I G
loops. O Merge deve ser feito em um vetor auxiliar, que I P R G M O
depois é copiado para o vetor inicial. G I M O P R
Recursão Exercício
MergeSort: exemplo da árvore de recursão
GIMOPR
MergeSort
1 6 3 PRIOMG
IPR GMO
Exercício:
1 3 2 PRI 4 6 5 OMG
Mostrar a árvore de recursão do
PR MO
Mergesort para o MIXSTRING (10 letras).
1 2 1 PR 3 3 - I 4 5 4 OM 6 6 - G
1 1 - - P 2 2 - R 4 4 - - O 5 5 - M
9
Árvores binárias Árvores binárias
Percursos recursivos
Análise do Mergesort:
+
* -
Complexidade:
Pior caso = melhor caso = caso médio: O(n log n) A B C /
A A B C /
B C /
E D E
D
Percurso in-ordem (ERD):
+
-Visitar a subárvore esquerda in-ordem, In-Ordem (p);
Se (p ≠ Nulo) Então
-Visitar a raiz, * -
In-Ordem (p↑ ↑.le);
-Visitar a subárvore direita in-ordem. Visita (p);
In-Ordem (p↑ ↑.ld); A B C /
Fim;
D E
A * B + C - D / E Externamente:
In-Ordem(T); A * B +C -D / E
10
Árvores binárias Árvores binárias
D E D E
Percurso em pós-ordem (EDR):
-Visitar a subárvore esquerda em pós-ordem, Pós-Ordem (p);
+
-Visitar a subárvore direita em pós-ordem, Se (p ≠ Nulo) Então
Pós-Ordem (p↑ ↑.le); * -
-Visitar a raiz. Pós-Ordem (p↑↑.ld);
Visita (p); A B C /
Fim;
D E
A B * C D E / - + Externamente:
Pós-Ordem(T); AB * C DE / - +
D E 20
15 80
Exercício: Dada uma expressão aritmética
com operadores binários, representada em uma 2 16 51 101
árvore binária, escrever a expressão equivalente
99 213
totalmente parentisada.
LIB
11
Árvores binárias Árvores binárias
99 213
99 213
12
Árvores binárias Árvores binárias
20 2
15 80 15
2 16 51 101
99 213 101
Enumeração de ABBs.
Exercício:
T(n) = número de ABBs distintas para n chaves
(1+4)/2= 2 M M
(6+9)/2=7
< >
D R D R
(1+1)/2= 1 (3+4)/2= 3 (6+6)/2=6 (8+9)/2=8
< > < >
B H P B H P T
T
(4+4)/2= 4
> > (9+9)/2=9
K V K V
13
Árvores binárias Árvores binárias
Exercício:
Constroi(e, d, p);
Se (e > d) Então
p ← Nulo
Desenhar a ADPB para n = 11.
Senão
i ← (e+d)/2;
Alocar(p); p↑↑.chave ← V[i];
↑.le);
Constroi(e, i-1, p↑
↑.ld);
Constroi(i+1, d, p↑
Fim;
Externamente:
Constroi(1, n, T);
Árvores Balanceadas
Para evitar a degeneração em ABB, foram cria- Árvores AVL (Adel’son-Vels’ii-Landis)
das as árvores balanceadas. A idéia é a de, a
Árvores binárias onde, para cada nó, a altura das
cada inserção em uma ABB, checar se a árvore
duas subárvores difere no máximo em 1.
está tendendo à degeneração e acertar ime-
diatamente, se necessário (balancear a árvore).
K -
O balanceamento é baseado na altura.
H - N 0
Tipos de árvores balanceadas:
AVL C 0 I + L + - P
B/B+
Rubronegras B - F 0 J 0 M 0 O 0
2-3, etc A 0 D 0 G 0
Balanceamento de AVL's
Caso 1 - Rotação Simples
14
Árvores binárias Árvores
Balanceamento de AVL's
Árvores AVL
Caso 1 - Rotação Simples - Balanceamento - Caso 2 - Rotação Dupla
Sit. Inicial: Desbalanceamento Rotação Dupla
a) Preservação da ordem de busca
Busca in-ordem antes: α.Na.β β.Nb.δ
δ’
depois: α.Na.β
β.Nb.δ
δ’
Na + Na ++ Nx 0
b) Preservação da altura
Antes: max(h, max(h, h)+1)+1 = h+2
α Nb 0 α Nb - Na 0|- Nb +|0
Depois: max(max(h, h) +1, h+1)+1 = h+2
(h) (h)
c) Balanceamento Nx 0 δ Nx δ α β’ γ’ δ
Subárvores α, β e δ’ balanceadas, por hipótese. -|+ (h)
β γ (h) β’ γ’ (h) (h)
Nós Na e Nb balanceados (esquema); restante da
árvore balanceada, por b). (h-1) (h-1) (h|h-1)(h-1|h) (h|h-1)(h-1|h)
Árvores Árvores
b) Preservação da altura
Antes: max(h, max(max(h-1, h-1)+1, h)+1)+1 = h+2 Criar e balancear, passo a passo, o
Depois: max(max(h, h| h-1)+1, max(h-1| h, h)+1)+1 = h+2 MIXSTRING.
c) Balanceamento
Subárvores α, β’, γ’ e δ balanceadas, por hipó-
tese. Nós Nx, Na e Nb balanceados (esquema);
res-tante da árvore balanceada, por b).
Árvores Árvores
K - K -
H - N 0 F 0 N 0
C 0 I + L + - P C 0 H + L + - P
B - F 0 J 0 M 0 O 0 B - D + G 0 I + M 0 O 0
A 0 D 0 G 0 A 0 E 0
J 0
E
15
Árvores Árvores
Busca_Insercao(k, p, h);
Busca_Insercao(k, p, h); ...
Se (p = Nulo) Então {Insere; h ← True;} Senão Se (k > p↑ ↑.chave) Então
Senão Se (k < p↑↑.chave) Então {Busca_Insercao(k, p↑ ↑.ld, h);
{Busca_Insercao(k, p↑ ↑.le, h); Se (h) Então
Se (h) Então ↑.bal):
Caso (p↑
↑.bal):
Caso (p↑ -1: {p↑ ↑.bal ← 0; h ← False;}
1: {p↑ ↑.bal ← 0; h ← False;} 0: {p↑ ↑.bal ← 1; }
0: {p↑ ↑.bal ← -1; } 1: {Se (p↑ ↑.ld↑
↑.bal = 1) Então RotSimplDir(p)
-1: {Se (p↑ ↑.le↑
↑.bal = -1) Então RotSimplEsq(p) Senão RotDuplDir (p);
Senão RotDuplEsq (p); p↑↑.bal ← 0; h ← False;
p↑↑.bal ← 0; h ← False; }
} }
} Senão h ← False;
continua... Fim; continua...
Árvores Árvores
RotSimplEsq(p);
pf ← p↑↑.le;
↑.le ← pf↑
p↑ ↑.ld; pf↑ ↑.ld ← p; p↑ ↑.bal ← 0;
Problema: determinar a maior altura possível para
p ← pf; ↑.bal ← 0;
p↑ h ← False; uma AVL com n chaves.
Fim;
RotDuplEsq(p);
pf ← p↑↑.le; pn ← pf↑ ↑.ld;
↑.ld ← pn↑
pf↑ ↑.le; pn↑
↑.le ← pf; p↑ ↑.le ← pn↑
↑.ld; pn↑
↑.ld ← p;
↑.bal = -1) Então p↑
Se (pn↑ ↑.bal ← 1
Solução: resolver o problema dual:
Senão ↑.bal ← 0;
p↑ Determinar o número mínimo de chaves em uma
↑.bal = 1) Então pf↑
Se (pn↑ ↑.bal ← -1 AVL de altura h.
Senão ↑.bal ← 0;
pf↑
p ← pn; p↑ ↑.bal ← 0; h ← False;
Fim;
Árvores Árvores
h 0 1 2 3 4 5 6 7 8 9 ⇒ h ≤ 1,4 log n,
T(h) 0 1 2 4 7 12 20 33 54 88 a altura máxima da AVL é 1,4 log n
a altura média da AVL é log n.
Fib(h) 0 1 1 2 3 5 8 13 21 34
16
Árvores Árvores
e um máximo de 2d chaves.
3) Nó intermediário com k chaves tem k+1 filhos.
4) As folhas estão todas no mesmo nível. A B D E F H I J K M N O Q R T U W X
Árvores Árvores
A B D E F H I J K M N O U V X Y
QR
R S
Árvores Árvores
SPLIT
17
Árvores Árvores
A E I O A E O U A D E F O Q U W I O R
A D E F J O P Q U W
I R A D E F J K P Q U W
+J,P
I R +K
A D E F O Q U W +T I O R
+C
A D E F J O P Q U W
A D E F J K P Q T U W
Árvores Árvores
D I O R D I O R U
+V
A C E F J K P Q T U W A B C E F G H J K L M P Q S T V W
O
+B,G,H,L,M, S D I O R +V
D I R U
A B C E F G H J K L M P Q ST U W
A B C E F G H J K L M P Q S T V W
Árvores Árvores
x x x x x x x x x
18
Árvores Árvores
Árvores Árvores
Árvores B Árvores B
Resumo do algoritmo de Inserção: Resumo do algoritmo de Inserção:
Busca_Insercao(k, p, h, v);
Se (p = Nulo) Então {v.c ← x; v.ld ← Nulo;}
Inserçao;
Senão
↑.m < 2d) Então
Se (p↑
i ← PB(x, p);
↑.m++; h ← False; Faz shift em Vv; Vv[i] ← u;
p↑
Se (i ≠ Nulo) Então h ← False
Senão
Senão {
Alocar(b);
Se (i = 0) Então q ← p↑↑.le
v ← item a ser promovido;
Senão q ← p↑↑.Vv[i].ld;
Transfere a metade direita de p para b;
Busca_Insercao(x, q, h, u);
Acerta a metade esquerda de p e limpa sua metade direita;
Se (h) Então Inserçao;
↑.m ← d; b↑
p↑ ↑.m ← d; b↑ ↑.le ← v.ld; v.ld ← b;
}
}
}
Fim;
Fim;
continua...
Árvores Árvores
1
Problema: determinar a maior altura possível para
2
uma árvore B, ordem d, com n chaves.
d
d h
19
Árvores Árvores
Árvores Árvores
2d .2d+1.. 2d 2d .2d+1.. 2d
Árvores Árvores
20
Árvores Árvores
Árvores B+ Árvores B+
Arquivos Sequenciais Indexados Árvores B+ de ordem 2
chaves (índice)
chaves + dados J
C F O S V
A B C D E F H I J M N O Q R S U V X Y
Árvores Árvores
Árvores B+ Árvores B+
Árvores B+ - Inserções Árvores B+
SPLIT
Árvores Árvores
Árvores B+ Árvores B+
Ex: Criar árvore B+ de ordem 2 para: Ex: Criar árvore B+ de ordem 2 para:
A E I O U D W Q F R J K T C B A E I O U D W Q F R J K T C B
+U I +D,W,Q I +F E I R
A E I O
A E I O U A D E I O Q U W
A D E F I O Q R U W
E I +J E I R
+R +K
A D E F I O Q U W
A D E F I J O Q R U W
21
Árvores Árvores
Árvores B+ Árvores B+
Ex: Criar árvore B+ de ordem 2 para: Ex: Criar árvore B de ordem 2 para:
A E I O U D W Q F R J K T C B A E I O U D W Q F R J K T C B
E I O R C E I O R
+B
A D E F I J K O Q R U W A B C D E F I J K O Q R T U W
I
+T,C E I O R +B
C E O R
A C D E F I J K O Q R T U W
A B C D E F I J K O Q R T U W
Árvores Árvores
x x x x x x x x x
Árvores
FIM
22