Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... ·...

44
Árvores Binárias de Busca Fernando Vanini IC – Unicamp Klais Soluções

Transcript of Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... ·...

Page 1: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Árvores Binárias de Busca

Fernando Vanini

IC – Unicamp

Klais Soluções

Page 2: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Inserção de um novo nó

• A localização do ‘ponto de inserção’ é semelhante à busca por um valor na árvore.

• Após a inserção do novo elemento, a árvore deve manter as propriedades de ‘árvore binária de busca’.

• O nó inserido é sempre uma folha.

E

B J

G+ E

B J

G

Ponto de

inserção

Page 3: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Inserção de um novo nó

A+

E

B J

G

Ponto de

inserçãoE

B J

GA

Page 4: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Inserção de um novo nó

D+

E

B J

G

Ponto de

inserçãoE

B J

GAA D

Page 5: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Inserção de um novo nó

C+

E

B J

G

Ponto de

inserção

E

B J

GAA DD

C

Page 6: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Remoção de um nó

• Caso 1 – O nó a ser removido é uma folha

G-

E

B J

G

E

B J

GAA DD

Page 7: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Remoção de um nó• Caso 2 – O nó X a ser removido não é uma folha

– 2a. esqDir = nó mais à direita da sub-arvore esquerda;conteúdo do no X = conteúdo de esqDir;remover (recursivamente) o nó esqDir;

E-

E

B J

G

D

B J

AA DKD G K

Page 8: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Remoção de um nó– 2a. esqDir = nó mais à direita da sub-arvore esquerda;

conteúdo do no X = conteúdo de esqDir;remover (recursivamente) o nó esqDir;

E-

E

B J

G

D

B J

AA KD G K

C

C

C

1

2

Page 9: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Remoção de um nó– 2b. dirEsq = nó mais à esquerda da sub-arvore direita;

conteúdo do no X = conteúdo de dirEsq;remover (recursivamente) o nó dirEsq;

E-

E

J

G

I

H

K

G

J

H

I

H

K

Page 10: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Árvores de busca balanceadas

• Árvore binária balanceada: uma árvore binária é dita balanceada se:– o número de nós das sub-árvores esquerda

difere no máximo de 1 do número de nós da sub-árvore direita.

– os sub-árvores esquerda e direita são balanceadas.

• Propriedade: a altura de uma árvore binária balanceada com n nós é igual a log2n+1

Page 11: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Árvores AVL• Árvore binária de busca auto balanceável• Autores: Adelson-Vesky e Landis (1962)• Idéia básica: cada nó mantém uma informação

adicional, chamada fator de balanceamento, que indica a diferença de altura entre as sub-árvores esquerda e direita.

• As operações de inserção e remoção mantém o fator de balanceamento entre -1 e +1.

• Embora não sejam perfeitamente balanceadas, épossível demonstrar que a altura de uma árvore AVL ainda é proporcional a log2n (~ 1.5* log2n)

Page 12: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Árvores AVL• Nas operações de inserção e remoção de elementos, o

balanceamento da árvore resultante é ajustado através da operação de rotação, que preserva a ordenação da árvore.

rotaçãodireita

esquerda

Page 13: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Árvores AVL

• As operações de inserção e remoção de nós numa árvore AVL, incluindo as eventuais operações de rotação, são realizadas em tempo proporcional a log2n.

Page 14: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Rotação à esquerda

void rotacaoEsquerda(tnodeptr * t){

tnodeptr x = (*t); /* != NULL */

tnodeptr y = x->dir; /* != NULL */

x->dir = y->esq;

if(y->esq != NULL) (y->esq)->pai = x;

y->pai = x->pai;

if(x->pai == NULL) *t = y;

else if(x == (x->pai)->esq) (x->pai)->esq = y;

else (x->pai)->dir = y;

y->esq = x;

x->pai = y;

}

Page 15: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Rotação à esquerda

E

B J

G K

*t x

y

E

B

J

G

K

*t

x

y

Page 16: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Rotação à direita

void rotacaoDireita(tnodeptr * t){

tnodeptr x = (*t); /* != NULL */

tnodeptr y = x->esq; /* != NULL */

x->esq = y->dir;

if(y->dir != NULL) (y->dir)->pai = x;

y->pai = x->pai;

if(x->pai == NULL) *t = y;

else if(x == (x->pai)->dir) (x->pai)->dir = y;

else (x->pai)->esq = y;

y->dir = x;

x->pai = y;

}

Page 17: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Rotação à direita

E

B J

G K

*t y

xE

B

J

G

K

*t

y

x

Page 18: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Referências na web

• http://en.wikipedia.org/wiki/AVL_tree

• http://www.site.uottawa.ca/~stan/csi2514/applets/avl/BT.html

• http://www.eli.sdsu.edu/courses/fall96/cs660/notes/avl/avl.html

• http://www.brpreiss.com/books/opus4/html/page320.html

Page 19: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Árvores rubro-negras

• Propriedades: 1.Todo nó é vermelho ou preto.

2.Toda folha é preta.

3.Se um nó é vermelho então seus filhos são pretos.

4.Todo caminho da raiz até qualquer folha tem sempre o mesmo número de nós pretos.

Page 20: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Características

• Uma árvore rubro-negra com n nós tem altura menor ou igual a 2log(n+1). ( Cormen, p 264)

• Uma busca numa árvore leva um tempo O(log n).

• Inserções e retiradas podem, se feitas como nas árvores binárias de busca ‘normais’ podem destruir as propriedades ‘rubro-negras’.

• Para restabelecer as propriedades, recorre-se a rotação e recoloração dos nós

Page 21: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Rotação

• rotação à esquerda ou à direita – essa operação preserva a ordenação da árvore.

rotaçãodireita

esquerda

Page 22: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Inserção - exemplo

Insere 5

10

3 15

201

A cor é definida pelas propridades.

10

3 15

201 5

Page 23: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Inserção - exemplo

Insere 7

10

3 15

201 5

nó vermelho comfilho vermelho.

10

3 15

201 5

710

3 15

201 5

7

Recolor.

Recoloração: o

novo nó começa

com vermelho e

é alterado em

caso de conflito.

Nó vermelho com

filho vermelho.

Page 24: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Inserção - Exemplo10

3 15

201 5

7

Insere 8

10

3 15

201 5

7

8

A recoloração anterior não funciona

Recolor & Rotate

10

3 15

201 7

85

Pai -> preto.Avô -> vermelho.Rotação no avô.

Recolor.

Page 25: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Inserção - exemplo

10

3 15

201 7

85

Insere 9

10

3 15

201 7

85

9Recolor

10

3 15

201 7

85

9

Continua ...

Page 26: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Inserção (cont.)10

3 15

201 7

85

9

É necessário recolorir o pai e o avô.

Rotação

10

3

15

20

1

7

8

5 9

O problema ainda não foi eliminado ...

Page 27: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Inserção (cont)

Recolor. e rotação

10

3

15

20

1

7

8

5 9

103

15

20

1

7

85

9

Page 28: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Referências na web• http://gauss.ececs.uc.edu/RedBlack/redblack.html

• http://ww3.algorithmdesign.net/handouts/RedBlackTrees.pdf

• http://www.cs.buap.mx/~titab/files/RedBlackTrees.pdf

• http://www.cs.dal.ca/~nzeh/Teaching/Fall%202003/3110/RedBlackTrees.pdf

• http://en.wikipedia.org/wiki/Red-black_tree

Page 29: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Árvores:Outras representações

• Dependendo da aplicação, pode ser necessário usar outra representação para árvores.

• Exemplo:typedef struct no* apno;

typedef struct no {

char* info;

apno pai

}

G

E

B F

K

Page 30: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Um exemplo:classes de equivalência (I)• inicialmente: p->pai = p; para todo elemento p.• raiz:apno raiz(apno p){

apno r = p;

if(r->pai == r) return r;

return raiz(r->pai);

}

• p e que são equivalentes ?bool equiv(apno p, apno q){

return(raiz(p) == raiz(q));

}

Page 31: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Um exemplo:classes de equivalência (I)

• fazer p e q equivalentes:

void mkEquiv(apno p,apno q){

apno r = raiz(p);

r->pai = raiz(q);

}

Page 32: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Árvore binária completa

• Uma árvore binária de altura h é completa se ela tiver 2h-1 nós.

Page 33: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Árvore binária completa

• Uma árvore binária completa pode ser representada num vetor v: – raiz em v[0]

– se um nó está em v[i], seus filhos estão em v[2*i+1] e v[2*i+1]

Page 34: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Árvore binária quase completa

• Uma árvore binária quase completa tem todos os seus níveis completos exceto o último, o qual tem apenas os elementos mais à esquerda.

• Uma árvore binária quase completa também pode ser representada num vetor.

Page 35: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Filas de prioridade

• Uma fila de prioridade é uma árvore binária tal que– o valor associado a cada nó é maior (ou menor)

que o valor associado a cada um dos seus filhos.

• Implementação:– se a fila de prioridade for uma árvore completa

ou quase completa, ela pode ser implementada num vetor.

Page 36: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Filas de prioridade

• Rearranjo: o elemento fora de ordem é trocado com o seu maior filho, sucessivamente atérestabelecer a 'condição de ordem' na fila de prioridade.

• No exemplo: 'h' seria trocado com 'm' e depois trocado com 'k'.

h

g m

d f j k

ea icb

Page 37: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Filas de prioridade• Rearranjo 'morro abaixo' : supondo que a fila de prioridade é

implementada num vetor v e o valor da raiz está fora de ordemvoid sift(int r, int m, int v[]) {

int x = v[r];

while (2*r < m) {

int f = 2*r+1;

if ((f < m) && (v[f] < v[f+1])) ++f;

if (x >= v[f]) break;

v[r] = v[f];

r = f;

}

v[r] = x;

}O trecho do vetor que contém a

sub-árvore a ser rearranjada édelimitado por r e m.

Page 38: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Filas de prioridade• Rearranjo 'morro acima' : a folha v[m] está fora de ordem

void upHeap(int r, int m, int v[])

{

int x = v[m];

int j = m/2;

while((j >= r)&&(v[j]< x)) {

v[m] = v[j];

m = j; j = j/2;

}

v[m] = x;

} O trecho do vetor que contém a

sub-árvore a ser rearranjada édelimitado por r e m.

Page 39: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Filas de prioridade

• Construção da fila a partir de um vetor em que os elementos não mantém nenhuma relação de ordem:– A construção parte 'de baixo para cima' a partir do último elemento da

primeira metade do vetor (penúltimo nível) porque o último nível já estáorganizado (cada sub-árvore só tem um nó).

void makePQueue (int n, int v[])

{

int r;

for (r = (n-1)/2; r >= 0; r--)

sift(r, n-1, v);

}

– A construção da fila é feita em tempo linear (!)

Page 40: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Filas de prioridade

• Inserir um valor x na fila (supondo que existe espaço no vetor):

v[++m] = x;

upHeap(0,m,v);

• Retirar o valor mais prioritário da fila:

x = v[0];

v[0] = v[m--];

sift(0,m,v);

Page 41: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Heapsort• O algoritmo heapsort usa a fila de prioridade para ordenar

um vetor:void heapsort (int n, int v[])

{

int p, m, x;

for (p = (n-1)/2; p >= 0; p--)

sift(p, n-1, v);

for (m = n-1; m >= 1; m--) {

x = v[0], v[0] = v[m], v[m] = x;

sift(0, m-1, v);

}

}

Page 42: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Referência na web

• Uma boa referência na web, em portugues, sobre estruturas de dados e algoritmos, além de uma introdução à linguagem C, estilo de programação, etc:

http://www.ime.usp.br/~pf/algoritmos/

Page 43: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Árvores gerais• Conjunto T não vazio de objetos

– um nó raiz

– demais nós em conjuntos T1, ...Tm, árvores disjuntas.

Page 44: Árvores Binárias de Busca - ic.unicamp.brvanini/mc202/apresentacoes/%C1rvores%20Bin%E1... · possível demonstrar que a altura de uma árvore AVL ainda é proporcional a log 2n

Árvores gerais• Representação binária