Escolar Documentos
Profissional Documentos
Cultura Documentos
augusto@usp.br
http://dfm.ffclrp.usp.br/~augusto
Introduo
Como visto, listas podem ser convenientemente definidas
da seguinte forma: Uma lista do tipo T
Uma lista (estrutura) vazia ou
Uma concatenao (cadeia) de um elemento do tipo T com uma
lista cujo tipo bsico tambm seja T
Introduo
Observando a similaridade das definies
evidente que uma lista possa ser
considerada como uma rvore na qual
cada n tem, no mximo, uma nica
subrvore
Por este motivo, uma lista tambm
denominada rvore degenerada
Definio
Uma rvore um conjunto finito de um ou mais
ns (ou vrtices) tais que
Existe um n especial, denominado raiz
Os demais ns encontram-se desdobrados em n 0
conjuntos disjuntos T1, ..., Tn sendo que cada conjunto
se constitui numa rvore
T1, ..., Tn so denominadas subrvores da raiz
Representaes
Uma rvore um grafo sem ciclos
A
Representaes
Conjuntos aninhados
Grafo
A
B
B
E
K
C
F
D
H
L
E
J
C
F
I
J
Representaes
Parnteses aninhados
Grafo
C
F
D
H
L
Representaes
Grafo
A
B
E
K
C
F
D
H
L
Paragrafao
A
B
E
K
F
C
G
D
H
L
I
J
Representaes
Grafo
A
B
E
K
C
F
D
H
L
Paragrafao
A
..B
....E
......K
....F
..C
....G
..D
....H
......L
....I
....J
Ns (Vrtices)
Esta rvore possui 12 ns (ou vrtices)
ns
Arestas (Arcos)
Uma aresta (arco) liga um n a outro
arestas
Raiz
Normalmente as rvores so desenhadas
de forma invertida, com a raiz em cima
raiz
Subrvores
No exemplo, o n A possui trs
subrvores (ramos) cujas razes so B, C
eD
A
Subrvores
No exemplo, o n B possui duas
subrvores (ramos) cujas razes so E e F
A
Folha
Um n sem descendentes (sem filhos ou sem
sucessores) denominado terminal ou folha
A
No-Folha
Um n com descendentes (com filhos ou com
sucessores) denominado no-terminal ou nofolha ou interior
A
Floresta
Uma floresta um conjunto de zero ou
mais rvores
No exemplo, temos 3 rvores que
compem uma floresta
B
Grau de um N
O nmero de descendentes (imediatos) de um n
denominado grau deste n
N
Grau
A
B
C
D
F
G
H
I
J
K
L
Grau de um N
O nmero de descendentes (imediatos) de um n
denominado grau deste n
N
Portanto, o grau de uma folha zero
A
B
(e vice-versa)
A
Grau
3
2
rvore Completa
Uma rvore de grau d uma rvore completa (cheia) se
Todos os ns tem exatamente d filhos, exceto as folhas e
Todas as folhas esto na mesma altura
Pai
As razes das subrvores de um n X so os filhos de X;
X o pai dos filhos
N Pai
Ns Filhos
A
B, C, D
E, F
H, I, J
Irmo
Os filhos (descendentes) de um mesmo n pai
(antecessor) so denominados irmos
A
Irmos
B, C, D
E, F
H, I, J
Ns
Av
E,F,G,H,I,J
Ns
Bisav
K, L
Caminho
Uma seqncia de ns distintos v1, v2, ..., vk tal
que sempre existe a relao
vi filho de vi+1 ou vi pai de vi+1, 1 i < k
Caminho
No Exemplo:
A, D, H, L um caminho entre A e L, formando pela seqncia de arestas
(A,D), (D,H), (H,L)
O comprimento do caminho entre A e L 3
A
Antecessores
Os antecessores (antepassados) de um n so todos
os ns no caminho entre a raiz e o respectivo n
No exemplo, os antecessores de L so A, D e H
A
Nvel
O nvel (ou profundidade) de um n definido
admitindo-se que a raiz est no nvel zero (nvel um)
Estando um n no nvel i, seus filhos estaro no nvel i+1
No existe um padro quanto ao nvel adotado para a
raiz, que determina o nvel dos demais ns
Assim, a raiz pode ser admitida como estando
No nvel zero
Alternativamente, no nvel um
Nvel
No exemplo, os ns:
B, C e D esto no nvel 1
K e L esto no nvel 3
0
Altura de um N
A altura de um n o nmero de arestas no maior
caminho desde o n at um de seus descendentes
Portanto, as folhas tm altura zero
No exemplo, os ns:
A
K, F, G, L, I, J tm altura 0
E, C e H tm altura 1
B e D tm altura 2
A tem altura 3
E
Nmero Mximo de Ns
O nmero mximo de ns n(h,d) em uma
rvore de altura h atingido quando todos
os ns possurem d subrvores, exceto os
de nvel h, que no possuem subrvores
Para uma rvore de grau d
Nmero Mximo de Ns
Assumindo d=3
Nvel 0: 1 n (raiz)
Nvel 1: 3 ns
Nvel 2: 32 = 9 ns
Nvel 3: 33 = 27 ns
n(3,3)= 1 + 3 + 9 + 27 = 40 ns
Nmero Mximo de Ns
Portanto, o nmero mximo de ns
n=n(h,d) soma do nmero de ns em
cada nvel, ou seja:
h
n = n(h, d ) = d = d + d + d + L + d
i
i =0
h +1
1
, d >1
d =
d 1
i =0
h
rvores (Perfeitamente)
Balanceadas
Uma rvore balanceada se, para cada
n, a altura de suas subrvores diferem,
no mximo, de uma unidade
Uma rvore perfeitamente balanceada
se, para cada n, os nmeros de ns em
suas subrvores diferem, no mximo, de
uma unidade
Todas as rvores perfeitamente
balanceadas tambm so rvores
balanceadas
n=5
n=1
n=2
n=3
n=4
n=6
n=7
rvore Orientada
Uma rvore orientada (ordenada) uma rvore na qual os filhos de
cada n so orientados (ordenados)
A orientao da esquerda para a direita
As duas rvores orientadas seguintes so distintas
A
B
Implementao de rvores
rvores podem ser implementadas
utilizando listas encadeadas
Cada n possui um campo de informao e
uma srie de campos de ligao, de acordo
como nmero de filhos daquele n
Dados
Campo de ligao
Campo de ligao
para a segunda subrvore para a prxima subrvore
4
Campo de ligao
para a primeira subrvore
Campo de ligao
para a prxima subrvore
Implementao de rvores
Entretanto, mais simples o caso em que
cada n tem um nmero mximo de filhos d
pr-estabelecido
...
Dados
Campo de ligao
para a primeira
subrvore
Campo de ligao
para a segunda
subrvore
Campo de ligao
para a d-sima
subrvore
Implementao de rvores
Por exemplo, a rvore
ternria seguinte
(d=3)...
A
B
D
C
B
E
J
E
L
K
C
D
Sub-rvore
direita
rvores Binrias
Podemos, por exemplo,
representar uma
expresso aritmtica (com
operadores binrios) por
meio de uma AB, na qual
cada operador um n da
rvore e seus dois
operandos representados
como subrvores
A rvore ao lado
representa a expresso
(a+b/c)*(d-e*f)
*
+
a
b
d
c
*
e
rvores Binrias
As duas AB seguintes so distintas
(i) a primeira tem subrvore direita vazia
(ii) a segunda tem subrvore esquerda vazia
B
(i)
(ii)
rvores Binrias
Exemplos de AB
(i) assimtrica esquerda (degenerada)
(ii) completa
A
A
B
B
D
(i)
C
E
(ii)
rvores Binrias
O nmero de mximo de ns em uma
rvore binria de altura h dado por:
h
n = n(h,2) = 2i = 2 h +1 1
i =0
h = log 2 (n + 1) 1
1500
1000
500
0
0
10
7
6
5
4
3
2
1
97
91
85
79
73
67
61
55
49
43
37
31
25
19
13
0
7
h
0
1
1
2
2
2
2
3
3
3
3
3
3
3
3
4
2500
n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
n
1
3
7
15
31
63
127
255
511
1023
2047
h
0
1
2
3
4
5
6
7
8
9
10
160
140
120
100
80
60
40
20
1.E+42
1.E+39
1.E+36
1.E+33
1.E+30
1.E+27
1.E+24
1.E+21
1.E+18
1.E+15
1.E+12
1.E+09
1.E+06
0
1.E+03
h
9
19
29
39
49
59
69
79
89
99
109
119
129
139
n
1.E+03
1.E+06
1.E+09
1.E+12
1.E+15
1.E+18
1.E+21
1.E+24
1.E+27
1.E+30
1.E+33
1.E+36
1.E+39
1.E+42
Percurso em AB
Seja uma AB em que R denota sua raiz, E e D
denotam as subrvores esquerda e direita,
respectivamente
Os ns de uma AB podem ser visitados de trs
formas (varredura da rvore):
Pr-ordem (pre-order): R, E, D
Em-ordem (in-order): E, R, D
Ps-ordem (post-order): E, D, R
visitar a raiz aps visitar as subrvores
Percurso em AB
Pr-ordem: A, B, D, H, E, C, F, I, G
A
Percurso em AB
Em-ordem: H, D, B, E, A, I, F, C, G
A
Percurso em AB
Ps-ordem: H, D, E, B, I, F, G, C, A
A
Percurso em AB
Pr-ordem
*+a/bcd*ef
Em-ordem
a+b/c*de*f
Ps-Ordem
abc/+def**
a
b
d
c
*
e
Campo de ligao
para subrvore esquerda
(LeftNode)
Esquematicamente:
N
(TreeNode)
Campo de ligao
para subrvore direita
(RightNode)
Dados
Ligao
para subrvore esquerda
Ligao
para subrvore direita
Questo
Utilize estas idias
para escrever uma
declarao de tipo que
poderia implementar
uma rvore binria
para armazenar valores
inteiros.
Voc tem 5 minutos
para escrever a declarao
Uma Soluo
class BinaryTree
{ public:
BinaryTree();
~BinaryTree();
void Insert(int x);
void Delete(int x);
bool Search(int x);
private:
// declarao de tipos
struct TreeNode
{ int Entry;
// tipo de dado colocado na rvore
TreeNode *LeftNode, *RightNode; // subrvores
};
typedef TreeNode *TreePointer;
// declarao de campos
TreePointer root;
};
Uma Soluo
class BinaryTree
{ public:
BinaryTree();
~BinaryTree();
Observe que o tipo
void Insert(int x);
void Delete(int x);
TreeEntry nesse caso
bool Search(int x);
um inteiro
private:
// declarao de tipos
struct TreeNode
{ int Entry;
// tipo de dado colocado na rvore
TreeNode *LeftNode, *RightNode; // subrvores
};
typedef TreeNode *TreePointer;
// declarao de campos
TreePointer root;
};
*
+
/
a
b
d
c
*
e
f
a
Operaes Bsicas
Com a definio dada j possvel implementar
alguns mtodos para AB que tambm se aplicam
para ABB (vista a seguir)
Como os algoritmos em geral so recursivos,
sero declarados dois mtodos de mesmo nome
O mtodo pblico que faz uma chamada ao mtodo
privado de mesmo nome, passando os parmetros
necessrios para o mtodo privado recursivo
(normalmente a raiz; mas outros parmetros tambm
podem ser passados)
O mtodo privado que efetivamente implementa o
algoritmo recursivo
Nmero de Ns
int BinaryTree::Nodes();
pr-condio: rvore binria j tenha sido criada
ps-condio: retorna o nmero de ns existentes na
rvore
Nmero de Ns
int BinaryTree::Nodes() // mtodo pblico
{ return Nodes(root);
}
//---------------------------------------------------------------------------int BinaryTree::Nodes(TreePointer &t) // mtodo privado
{
if(t == NULL)
return 0;
else
return 1 + Nodes(t->LeftNode) + Nodes(t->RightNode);
}
Nmero de Folhas
int BinaryTree::Leaves();
pr-condio: rvore binria j tenha sido criada
ps-condio: retorna o nmero de folhas existentes
na rvore
Nmero de Folhas
int BinaryTree::Leaves()
{ return Leaves(root);
}
//------------------------------------------------------------------------int BinaryTree::Leaves(TreePointer &t)
{ if(t == NULL)
return 0;
else
if(t->LeftNode == NULL && t->RightNode == NULL)
return 1;
else
return Leaves(t->LeftNode) + Leaves(t->RightNode);
}
Altura
int BinaryTree::Height();
pr-condio: rvore binria j tenha sido criada
ps-condio: retorna a altura da rvore
Altura
int BinaryTree::Height()
{ return Height(root);
}
//-------------------------------------------------------------------------int BinaryTree::Height(TreePointer &t)
{ if(t == NULL)
return -1;
else
{ int L,R;
L = Height(t->LeftNode);
R = Height(t->RightNode);
if(L>R) return L+1; else return R+1;
}
}
Percurso em Pr-Ordem
Para percorrer uma AB em pr-ordem, assumese que existe um procedimento (ou mtodo)
denominado
void process(TreeEntry x)
Percurso em Pr-Ordem
void BinaryTree::PreOrder()
{ PreOrder(root);
}
//-------------------------------------------------------------------------void BinaryTree::PreOrder(TreePointer &t)
{
Em situaes
if(t != NULL)
mais simples,
{ process(t->Entry);
process pode ser
PreOrder(t->LeftNode);
substitudo por
um comando de
PreOrder(t->RightNode);
escrita
}
}
Percurso em Pr-Ordem
void BinaryTree::PreOrder()
{ PreOrder(root);
}
//-------------------------------------------------------------------------void BinaryTree::PreOrder(TreePointer &t)
{
Em situaes
if(t != NULL)
mais simples,
{ cout << t->Entry << endl;
process pode ser
PreOrder(t->LeftNode);
substitudo por
um comando de
PreOrder(t->RightNode);
escrita
}
}
Impresso
A impresso de uma rvore binria pode
ser efetuada utilizando algum dos
percursos (pr-, in- ou ps-ordem) ou
qualquer outra estratgia que for mais
adequada
A implementao seguinte imprime com
deslocamentos (espaos) uma AB
Impresso
void BinaryTree::Print()
{ BinaryTree::Print(root,0);
}
//-------------------------------------------------------------------------void BinarySearchTree::Print(TreePointer &t, int s)
{ int i;
if(t != NULL)
{ Print(t->RightNode, s+3);
for(i=1; i<=s; i++)
cout << ;
// espaos
cout << setw(6) << t->Entry << endl;
Print(t->LeftNode, s+3);
}
}
Consideraes Finais
Nesta apresentao foram vistos vrios conceitos
sobre rvores e rvores binrias, incluindo alguns
algoritmos mais elementares
Entretanto, imagine o processo de busca de
informao em uma rvore (binria ou no)
Se as chaves no esto em uma ordem prestabelecida, toda a estrutura precisa ser percorrida
para encontrar uma determinada chave (no pior caso),
o que no seria eficiente