Você está na página 1de 25

AED

Algoritmos e Estruturas de Dados


LEEC - 2005/2006

rvores

rvores - Introduo (1)


As rvores so estruturas de dados usadas em diversas
aplicaes na vida comum:
Bases de dados de grande dimenso.
Reconhecimento de frases geradas por linguagens (ex: programas,
expresses aritmticas,...).
Modelao de sistemas organizacionais (ex: famlias, directrios de um
computador, hierarquia de comando de uma empresa,...).
Determinao do caminho mais curto entre dois computadores de uma
rede.

AED (IST/DEEC)

rvores - Introduo (2)


Def: Uma rvore um caso especial de um grafo, i.e., um par
(V,E) de dois conjuntos no vazios V-ns (vertex) e V2
arestas (edges) que satisfazem duas condies:
Entre dois ns existe um nico caminho (um caminho (path) uma
sequncia de arestas entre dois ns),
Um nico n, denominado raz (root), s existe como primeiro elemento
nos pares de E: os restantes ns so um segundo elemento dos pares de E
(podendo tambm ser primeiro elemento de alguns pares).
Nota: a existncia de uma raz til em muitas aplicaes mas no essencial
para a definio anterior. Este tipo de rvores tambm denominada rvores
com raz (rooted tree).

AED (IST/DEEC)

rvores - Introduo (3)


Def: se (v1,v2) E, v1 n ascendente (parent) e v2 n filho
(child).
A raz o nico n sem ascendente.
Ns sem filhos so designados por folhas (leaves).
Ns com filhos so designados no-terminais. Ns no-terminais, distintos da
raiz, so designados intermdios.

Def: A rvore de tipo K, sse todos os ns intermdios tiverem K


filhos. Quando K=2, a rvore diz-se binria.
Def: O nvel (level) de um n o nmero de arestas entre a raz e o
n (a raz tem nvel 0). A altura (heigth) de uma rvore o mximo
nmero de ns encontrados nos caminhos at s folhas (uma rvore
s com a raiz tem altura 1).
AED (IST/DEEC)

rvores - Introduo (4)


Representao grfica das rvores adopta a conveno:
raz no topo,
ns representados por crculos,
arestas representadas por linhas (ou setas no sentido da raz para a folha).

Exemplo A1: directrios do sistema operativo Linux


/

bin

dev

etc

cfb

home

usr

lmv

var

rgc

AED (IST/DEEC)

rvores - Introduo (5)


Exemplo A2: expresses aritmticas
2+3*5

(2+3)*5

raiz

+
n1
2

*
folha
*
n3

n2
3

n4

+
5

n5

5
3

V={n1,n2,n3,n4,n5}
E={(n1, n2),(n1,n3),(n3,n4),(n3,n5)}

A rvore avaliada de forma ascendente (bottom-up): 2+3*5 = 2+15 = 17


Parntesis, usados nas expresses aritmticas para ultrapassar as prioridades dos
operadores, so indicados na rvore atravs da posio dos ns.
AED (IST/DEEC)

rvores - Introduo (6)


Exemplo A3: rvore (ordenada) de pesquisa binria1
12
5
2

17
8

31

<n

>n

Subrvore direita (esquerda) armazena nmeros maiores (menores)


que o n. Se os dados forem cadeias de caracteres, usa-se a ordem
lexicogrfica (cf>cb e cf>az ).
Vantagens: pesquisa mais rpida-O(log N)
Inconvenientes: pode degenerar lista com pesquisa-O(N), a resoluo deste
problema torna insero mais complicada
1 BST - Binary Search Tree
AED (IST/DEEC)

rvores - Introduo (7)


Uma rvore de tipo K pode ser transformada numa rvore binria, com
referncias esquerdas contm sucessivamente as sub-rvores da rvore K
referncias direitas contm referncia para a parte restante da rvore K

Exemplo A4: transformao de uma rvore ternria numa rvore


binria

a
b
c

AED (IST/DEEC)

rvores - Introduo (8)


As rvores BB possuem, em cada n, uma tabela para as subrvores. So usadas em Bases de Dados.
a

A<a<B<b<C<c<D
Todos os caminhos da raiz para as folhas possuem o mesmo comprimento
AED (IST/DEEC)

rvores - Introduo (9)


Em AED/LEEC so estudadas apenas rvores BST(binary search tree):
Representao de uma rvore binria em C
Propriedades
Operaes:
Insero de um elemento numa rvore
Directa
Balanceada
AVL
RB

Combinao de duas rvores


Retirada de um elemento
Percurso de uma rvore

AED (IST/DEEC)

10

rvores - Representao em C
Seja a definio em C de uma rvore binria, contendo cada n um
dado de tipo Item.
typedef data;
typedef struct _s1 {
Item data; /* dados */
struct _s1 *left, *right; /* referncia filhos */
} node;
node *root = NULL; /* raz (rvore inicial vazia) */

AED (IST/DEEC)

11

rvores - Propriedades (1)


Teorema A1: Uma rvore binria com N ns no-terminais possui N+1 folhas.
Estratgia de prova: induo, com base na construo da rvore a partir de duas
subrvores.
Se N=0, a rvore possui um nico n (que raiz e folha em simultneo).
Seja N>0 o nmero de ns no-terminais: a subrvore esquerda
tem k ns, a subrvore direita tem N-k-1 ns (0<k<N+1).
Por hiptese, a subrvore esquerda tem k+1 folhas
e a subrvore direita tem N-k folhas.

Somando, a rvore tem (k+1)+(N-k)=N+1 folhas.


QED
k
N-k-1

AED (IST/DEEC)

12

rvores - Propriedades (2)


Teorema A2: Uma rvore binria com N ns no-terminais possui 2N arestas (N-1 para
os ns no-terminais e N+1 para as folhas).
Estratgia de prova: contar o nmero de arestas para cada n.
Exceptuando a raiz, cada n possui um nico ascendente, pelo que s h uma
aresta entre um n e o seu ascendente.
Pelo teorema A1 e observao anterior, h N+1 arestas para as folhas. Pelas duas
observaes anteriores, h N-1 arestas para os ns intermdios. No total, a rvore
com N ns no-terminais possui (N+1)+(N-1)=2N arestas.
QED

AED (IST/DEEC)

13

rvores - Propriedades (3)


Teorema A3: Numa rvore binria com N ns, o nvel das folhas hl varia entre log2N e
N-1.
Estratgia de prova: identificar nveis mximo e mnimo.
O nvel mximo o da rvore degenerada numa lista.
Neste caso, hl=N-1 arestas.
O nvel mnimo o da rvore balanceada, cada nvel
i com 2i ns. Por A1 h N+1 folhas, logo 2hl-1<N+12hl.
Assim, hl o maior inteiro igual ou inferior a log2N
(ex: log27 = 2, log28 = 3)
QED

AED (IST/DEEC)

14

Sntese da Aula 1 de rvores


Introduo s rvores
Representao em C
Propriedades bsicas de rvores

AED (IST/DEEC)

15

rvores - Insero (1)


Sendo as rvores recursivas, as funes de manipulao podem
ser recursivas: a instruo recursiva aplicada nos ns
intermdios e a instruo terminal nas folhas.
As rvores so, usualmente, construdas de forma descendente
(top-down).
Nos algoritmos de insero consideramos o item um inteiro
(typedef int Item;) e uma rvore BST. Se a informao
a armazenar for uma estrutura, um dos campos designado chave
(key) tem de ser tipo ordenado. Ex: no bilhete de identidade, a
chave o nmero do BI.
AED (IST/DEEC)

16

rvores - Insero (2)


Insero directa
A insero efectuada em dois casos, conforme situao da rvore:
vazia: insere directamente novo dado
no vazia: procura, em primeiro lugar, o n onde inserir o novo dado
node *insert(int i, node *tree) {
node *upper = tree, *child = tree,

*leaf;

if (tree == NULL) { /* rvore vazia */


tree = (node *) malloc(sizeof(node));
tree->data = i; /* insere dado */
tree->left = tree->right = NULL; /* sub-rvores vazias */
return tree;
}

AED (IST/DEEC)

17

rvores - Insero (3)


while (child != NULL){/* procura n onde inserir dado */
upper = child;
if (child->data == i) return tree; /* j existe! */
child = (child->data > i) ? child->left : child->right;}
/* criada e inicializada nova folha */
leaf = (node *) malloc(sizeof(node));
leaf->data = i;
leaf->left = leaf->right = NULL;
/* upper passa a n intermdio e aponta para nova folha */
if (upper->data > i) upper->left = leaf;
else upper->right = leaf;
return tree;
}
/* rotina insert retorna nova rvore (i.e. ponteiro para raz), porque a inicial foi alterada */

AED (IST/DEEC)

18

rvores - Insero (4)


Exemplo A5: insero de 7 na rvore do exemplo A3

i) 7 < 12: insere na sub-rvore esquerda.


ii) 7 > 5: insere na sub-rvore direita.
iii) 8 folha:
cria nova folha.
7 < 8: a nova folha sub-rvore
esquerda.

12
i
5

ii
8

17

31

iii
7

O algoritmo degenera numa lista, se os dados inseridos forem


sucessivamente crescentes (ou sucessivamente decrescentes).

AED (IST/DEEC)

19

rvores - Insero (5)


A complexidade da insero depende do tipo de rvore:
rvore degenerada (lista): O(N)
rvore perfeitamente balanceada: complexidade determinada pela
pesquisa do local de insero log2N, ou seja, O(log N)
rvore de insero aleatria: considerando que a altura de cada subrvore possui uma distribuio uniforme 1..N, tem-se que a pesquisa
do local de insero custa ln N, ou seja, O(log N)

AED (IST/DEEC)

20

rvores - Insero (6)


Estratgia de prova: simplesmente, efectuar os clculos!
O custo 1 (visita raiz) somado ao custo da visita sub-rvore: esta pode ter
entre 0 e N-1 ns, com distribuio uniforme

CN = 1 + 1/N * Ck-1

1 k N, para N 2

C1 = 1
Para eliminar , multiplica-se ambos os lados por N, e subtrai-se a frmula
para N-1 (nota: k varia at N nos dois )

NCN - (N-1)CN-1 = N + Ck-1 (N-1 + Ck-2 ) = 1 + CN-1


NCN = NCN-1 +1
CN = CN-1 + 1/N
AED (IST/DEEC)

21

rvores - Insero (7)


por substituio telescpica

CN = C1 + 1/N + 1/(N-1) + ... + 1/2


Trata-se da srie harmnica, pelo que
CN ln N + + 1/12N
QED

Concluso: o custo da insero mnimo se a rvore for


balanceada
O problema reside na maior dificuldade em manter a rvore
balanceada (como se vai ver nos acetatos seguintes)
AED (IST/DEEC)

22

rvores balanceadas AVL (1)


Def: Uma rvore diz-se balanceada AVL2, sse em todos os ns
a diferena entre as alturas das subrvores for igual ou inferior a
1.
Exemplo A6: rvore A3 balanceada, A4 j no (subrvore
esquerda tem altura 2 e direita tem altura 4).
Para manter a rvore balanceada, respeitando a ordem, depois da
insero pode ser necessrio rodar a configurao de ns
(rotao simples e rotao dupla)
2Adelson-Velskii

e Landis

AED (IST/DEEC)

23

rvores balanceadas AVL (2)


Operaes de rotao so classificadas de acordo com o sentido (
direita e esquerda).
y

Rotao direita

x
y

Rotao esquerda

Quando a diferena de alturas for igual a 2, a operao de rotao


diminui o nvel da folha mais afastada da raiz, mantendo a
ordenao da rvore.
AED (IST/DEEC)

24

rvores balanceadas AVL (3)


A funo de rotao apenas actualiza ponteiros ( a nica subrvore a mudar de ascendente).
Assim, a rotao tem complexidade O(1).
node *rotate_right(node * tree) {
node *x, *y, *beta;
/* inalterada se rvore vazia, ou subrvore esquerda vazia */
if (tree == NULL) return tree;
else if (tree->left == NULL) return tree;
/* salva ponteiros */
y = tree; x = tree->left; beta = x->right;
/* actualiza ligaes */
x->right = y; y->left = beta;
return x;
}

AED (IST/DEEC)

25

rvores balanceadas AVL (4)


H dois pares de casos em que se torna necessrio rodar subrvores:
1: Rotao simples ( direita)
x

h
A3

h+1
A1

AED (IST/DEEC)

A2

x
h+1

A1
A2

A3

26

rvores balanceadas AVL (5)


2: Rotao dupla ( direita)
x

A4

h
A1

A1
A2

A2

A3

A4

A3

A2 ou A3 de altura h

AED (IST/DEEC)

27

rvores balanceadas AVL (6)


Cdigo de insero AVL
int height(node *tree) {
int hl, hr;
if (tree == NULL) return 0;
if (tree->left == NULL && tree->right == NULL)
return 1;
hl = height(tree->left); hr = height(tree->right);
return ((hl>hr) ? 1+hl : 1+hr);
}

AED (IST/DEEC)

28

rvores balanceadas AVL (7)


node *insert(int i, node *tree) {
/* tree ponteiro para rvore: a alterao feita directamente na
rvore que dada como parmetro */
int h1, h2, h3;
if (tree == NULL) { /* rvore vazia */
tree = (node*) malloc(sizeof(node));
tree->data = i;
tree->left = tree->right = NULL;
return tree;
}

AED (IST/DEEC)

29

rvores balanceadas AVL (8)


if (i == tree->data) return tree; /* j instalado */
if (i < tree->data){ /* insere na sub-rvore esquerda */
tree->left = insert(i, tree->left);
h1 = height(tree->left->left);
h2 = height(tree->left->right);
h3 = height(tree->right);
if (h1 > h3) /* Caso 1, rotao simples direita */
tree = rotate_right(tree);
if (h2 > h3) { /* Caso 2, rotao dupla direita */
tree->left = rotate_left(tree->left);
tree = rotate_right(tree); } }

AED (IST/DEEC)

30

rvores balanceadas AVL (9)


else {/* insere na sub-rvore direita */
tree->right = insert(i, tree->right);
h1 = height(tree->right->right);
h2 = height(tree->right->left);
h3 = height(tree->left);
if (h1 > h3) /* Caso 1, rotao simples esquerda */
tree = rotate_left(tree);
if (h2 > h3) {/* Caso 2, rotao dupla esquerda */
tree->right = rotate_right(tree->right);
tree = rotate_left(tree); } }
retun tree;
}

AED (IST/DEEC)

31

rvores balanceadas AVL (10)


O algoritmo AVL no garante distribuio total pelos nveis
intermdios (por exemplo, na srie S0+(-1)nn, a sub-rvore
esquerda s deriva esquerda e a sub-rvore direita s deriva
direita).
O algoritmo de insero listado pesado devido determinao
das alturas. Uma verso mais eficiente (embora mais complexa
e ocupando mais memria), guarda em cada n o balanceamento
das sub-rvores (maior esquerda, iguais ou maior direita).

AED (IST/DEEC)

32

Sntese da Aula 2 de rvores


Insero de elementos
rvores balanceadas AVL

AED (IST/DEEC)

33

rvores balanceadas RB (1)


Def: Uma rvore balanceada RB3 uma BST, em que:

Todos os ns possuem uma cor: Vermelha , Negra.


A raiz e todas as folhas so negras.
Filhos dos ns vermelhos so negros.
Todos os caminhos, da raiz s folhas, possuem o mesmo nmero de ns
negros (diferenas do nmero de ns vermelhos inferior a 2)

Nota: nos grafos, ponteiros nulos


considerados como folhas negras

Red Black

AED (IST/DEEC)

34

rvores balanceadas RB (2)


Cdigo de insero RB
1 Inserir directamente, como n vermelho.
2 H 3 alteraes possveis.
Se a alterao quebrar as regras das rvores RB, ento rodar e
recolorir em direco raiz.
A insero custa O(log N).

AED (IST/DEEC)

35

rvores balanceadas RB (3)


A Se inserir como raiz, passar n a negro.
B Se o n ascendente for negro, terminar.

novo n

AED (IST/DEEC)

36

rvores balanceadas RB (4)


C Se o n ascendente for vermelho, rodar duplamente e actualizar cores do
pai/me, av/av e tio/tia
y

x
y
w

novo n

Pode ter de recolorir


em cima

x
y
w

novo n

y
z

AED (IST/DEEC)

37

rvores balanceadas RB (5)


x
y

w
z

novo n
Codificao pode ser feita de 2 formas:
Cada n possuir ponteiro para o n pai/me
Recursivamente (muito complicado!)
AED (IST/DEEC)

38

rvores - Combinao (1)


Combinao permite juntar, numa nica rvore, duas rvores (cada
uma com dados parciais)
Se uma das rvores nula, a combinao apenas a outra rvore.
Seno, insere-se os elementos da primeira na segunda.
node *join(node *a, node *b) {
if (a == NULL) return b;
if (b == NULL) return a;
b = insert(a->data, b);
b = join(a->left, b); /* Sedgewick tem join(a->left,b->left); */
b = join(a->right, b);/* Sedgewick tem join(a->right,b->right); */
free(a);
return b;}
AED (IST/DEEC)

39

rvores - Combinao (2)


Soluo proposta por Sedgewick (Prog 12.16) incorrecta!
Fazer join , logo nas sub-rvores esquerda e direita, impede verificar o
mesmo dado em ns de alturas distintas!
30

10

10

-10

20

-10

30

10
0
0

10

Errado!!!

20

+
-10

20

20

30

30

-10
0

AED (IST/DEEC)

40

rvores - Retirada
Um dado eliminado da rvore, executando os passos
Procurar o n de residncia
Se existir, executar:
Combinar sub-rvores esquerda e direita
Substituir n pelo resultado da combinao
node *delete(int i, node *tree) {
node *aux = tree;
if (tree == NULL) return NULL;
if(i < tree->data) tree->left = delete(i, tree->left);
if(i > tree->data) tree->right = delete(i, tree->right);
if(i == tree->data ) {
tree = join(tree->left, tree->right);
free(aux); }
return tree;}
AED (IST/DEEC)

41

rvores - Varrimento (1)


Existem diversas estratgias de percurso/varrimento (transverse)
de rvores:
1 De acordo com o operador, existente em todos os ns que no sejam
folhas (percurso tambm designado por dump)
Pr-fixado: antes do varrimento das sub-rvores.
In-fixado: varrer primeiro sub-rvore esquerda, imprimir operador e varrer
depois a sub-rvore direita.
Ps-fixado4: depois do varrimento das sub-rvores.

2 De acordo com o nvel


Profundidade (depth-first)
Largura (breadth-first)

tambm conhecido por notao polaca invertida

AED (IST/DEEC)

42

rvores - Varrimento (2)


1: De acordo com o operador

As subrvores so varridas de forma ordenada e o operador


listado de forma pr-determinada (pr-fixado, in-fixado ou psfixado)
Exemplo A7: percurso ps-fixado da rvore aritmtica A2
typedef struct {
enum {nod, leaf} node_type;
union {
enum {plus, times} oper;
int value; } info;
} Item;

AED (IST/DEEC)

43

rvores - Varrimento (3)


void postfix (node *tree){
if (tree == NULL) return;
switch(tree->data.node_type) {
case leaf: /* imprime o valor */
printf( %d, tree->data.info.value);
break;
case nod: /* imprime sub-rvores esquerda e direita */
postfix(tree->left); postfix(tree->right);
switch(tree->data.info.oper) { /* imprime oper */
case plus: printf( +); break;
case times: printf( *); break; }}}

AED (IST/DEEC)

44

rvores - Varrimento (4)


+
n1
2

*
n3

n2
3

n4

n5

n1
n2

n3

+
n4

n5
3

*
5

o resultado final : 2 3 5 * +

AED (IST/DEEC)

45

rvores - Varrimento (5)


2: De acordo com o nvel

Profundidade: idntico ao varrimento pr-fixado


void depth_first (node *tree){
if (tree ==NULL) return;
printf( %d, tree->data);
depth_first(tree->left);
depth_first(tree->right); }

Exemplo A8: O varrimento em profundidade da rvore A3 executa


a seguinte sequncia de passos:
(a) elemento da raiz: 12
(b) visita em profundidade sub-rvore esquerda: 5 2 8
(c) visita em profundidade sub-rvore direita: 17 31.
O resultado 12 5 2 8 17 31

AED (IST/DEEC)

12
5
2

17
8

31

46

rvores - Varrimento (6)


Largura: O varrimento feito por nvel. As sub-rvores so
colocadas no fim de uma lista.
typedef struct _s2 {
node *this;
struct _s2 *next;
} link;
link *New(); /* cria lista vazia */
void InsertLast(link *, node *);/* insere no fim da lista */
link *GetFirst(link *);/* obtm primeiro elemento da lista */

AED (IST/DEEC)

47

rvores - Varrimento (7)


void breadht_first (link *list){
if (list == NULL) return;
else {
link * aux = GetFirst(list);
printf( %d, aux->this->data);
InsertLast(list, aux->this->left);
InsertLast(list, aux->this->right);
breadht_first(list); }
}

Rotina deve ser chamada com a raiz inserida na lista.


breadht_first(InsertLast(New(), root));

AED (IST/DEEC)

48

rvores - Varrimento (8)


Exemplo A9: varrimento em largura da rvore A3
Lista
[12]
[5, 17]
[17]

12
5
2

[17,2,8]
[2,8]

17
8

31

[2,8,31]
[8,31]

[31]

[]

Aco
Recolhe 1 elemento
Imprime valor
Insere subrvores esq e dir
Recolhe 1 elemento
Imprime valor
Insere subrvores esq e dir
Recolhe 1 elemento
Imprime valor
Insere subrvores esq e dir
Recolhe 1 elemento
Imprime valor
Insere subrvores esq e dir
Recolhe 1 elemento
Imprime valor
Insere subrvores esq e dir
Recolhe 1 elemento
Imprime valor
Insere subrvores esq e dir

Sada
12

17

31

AED (IST/DEEC)

49

Sntese da Aula 3 de rvores


rvores balanceadas RB
Combinao de rvores
Retirada de elementos
Varrimento de rvores

AED (IST/DEEC)

50

Você também pode gostar