• Nenhum resultado encontrado

E STRUTURAS DED ADOSE A LGORITMOS Á RVOREB

N/A
N/A
Protected

Academic year: 2019

Share "E STRUTURAS DED ADOSE A LGORITMOS Á RVOREB"

Copied!
48
0
0

Texto

(1)

1

E

STRUTURASDE

D

ADOS E

A

LGORITMOS

Á

RVORE

B

INÁRIA Adalberto Cajueiro

Departamento de Sistemas e Computação Universidade Federal de Campina Grande

1

Á

RVORE

(E

XEMPLO

)

Como seria pesquisar

a localização de um arquivo no

windows explorer se não

tivéssemos diretórios?

Para entradas realmente grandes, o acesso linear é proibitivo!

Precisamos de alguma estrutura nao-linear de

(2)

2

Á

RVORE

 Estrutura não-linear com tempo de acesso em média O(log n).

 Coleção de nós em hierarquia

 Vazia ou

 Raiz (root) e zero ou mais subárvores

Raiz da subárvore é um nó filho do nó raiz

 A raiz de uma árvore é unica!

 Não possui ciclos

 N nós, N-1 arestas

3

Á

RVORE

(I

LUSTRACAO

)

raiz

...

raiz

root

(3)

3

Á

RVORE

(I

LUSTRACAO

)

raiz

...

folha (leaf)

5

6

Á

RVORE

raiz

...

Nível 0

Nível 1

Nível k

Nível k + 1

(4)

4

Á

RVORE

Uma

árvore binária

é uma estrutura de

dados caracterizada por:

 Ou não tem elemento algum (árvore vazia)

 Ou tem um elemento distinto, denominado raiz, com duas referencias para duas

estruturas diferentes, denominadas sub-árvore (filho) esquerda e sub-árvore (filho) direita

 Cada nó pode ter grau: 0, 1 ou 2

7

Á

RVORE

 A ligação entre os nós são vistas como

apontadores direcionados do pai para os filhos.

 Por questoes de implementação apontadores podem

existir também dos filhos para o pai

 O numero de filhos por nó diferenciam os vários tipos de arvores existentes.

 Cada nó da árvore encontra-se em determinado nível. A raiz encontra-se no nível zero.

Propriedade fundamental: só existe um caminho da raiz para um outro nó da árvore.

 Altura de uma árvore: comprimento do caminho mais longo da raiz até as folhas

(5)

5

Á

RVORE

(A

PLICABILIDADE

)

Representacao de expressoes aritméticas

 5*3 + 4/2

+

* /

5 3 4 2

9

E

XERCÍCIO

Qual a profundidade do nó 6?

Qual a altura da árvore?

Os nós 6 e 9 estão no mesmo nível? e 7 e 11?

Qual o grau do nó 7? E de 9? E de 4?

(6)

6

Á

RVORES

E

STRITAMENTE

B

INÁRIAS

 Cada nó possui grau 0 ou 2

 Quantos nós terá uma AEB com n folhas?

7

4

9

1

6

3

2

Desenhe diversas arvores e tente deduzir.

11

E

XERCÍCIO

 A árvore a seguir é estritamente binária? Justifique.

(7)

7

Á

RVORE

B

INÁRIA

C

OMPLETA

Todos os níveis são completos (folhas estão

no mesmo nível)

 Qual a relacao que existe entre a altura de uma árvore binária completa e o número de elementos em cada nível?

 Qual a relacao que existe entre a altura de uma árvore binária completa e o número de elementos no total?

nível 0 – nos:1 – total:1

nível 1 – nos:2 – total:3

nível 2 – nos:4 – total:7

nível 3 – nos:8 – total:15

13

Á

RVORE

B

INÁRIA

C

OMPLETA

Todos os níveis são completos (folhas estão

no mesmo nível)

 Qual a relacao que existe entre a altura de uma árvore binária completa e o número de elementos em cada nível?

 Qual a relacao que existe entre a altura de uma árvore binária completa e o número de elementos no total?

nível 0 – nos:1 – total:1

nível 1 – nos:2 – total:3

nível 2 – nos:4 – total:7

nível 3 – nos:8 – total:15

h 2h 2h+1 - 1

(8)

8

Á

RVORES

B

INÁRIAS

(P

ERCURSOS

)

 Formas de percurso em árvore binárias:

 Pré-ordem (RAIZ, ESQ, DIR)

Visita raiz

Percorre sub-árvore esquerda em pré-ordem

Percorre sub-árvore direita em pré-ordem

 Em-ordem (simétrica) (ESQ, RAIZ, DIR)

Percorre sub-árvore esquerda em ordem simétrica Visita raiz

Percorre sub-árvore direita em ordem simétrica  Pós-ordem (ESQ, DIR, RAIZ)

Percorre sub-árvore esquerda em pós-ordem

Percorre sub-árvore direita em pós-ordem Visita raiz

 Applet:

 http://www.cosc.canterbury.ac.nz/mukundan/dsal/BTree.html

15

A

RVORES BINÁRIAS

 Impressão em pré-ordem (R,E,D):

8

4 12

2

1 3

6

5 7

10 14

9 11 13 15

(9)

9

A

RVORES BINÁRIAS

 Impressão em pré-ordem:

8

4 12

2

1 3

6

5 7

10 14

9 11 13 15 8

17

A

RVORES BINÁRIAS

 Impressão em pré-ordem:

8

4 12

2

1 3

6

5 7

10 14

9 11 13 15 8,4

(10)

10

A

RVORES BINÁRIAS

 Impressão em pré-ordem:

8

4 12

2

1 3

6

5 7

10 14

9 11 13 15 8,4,2

19

A

RVORES BINÁRIAS

 Impressão em pré-ordem:

8

4 12

2

1 3

6

5 7

10 14

9 11 13 15 8,4,2,1

(11)

11

A

RVORES BINÁRIAS

 Impressão em pré-ordem:

8

4 12

2

1 3

6

5 7

10 14

9 11 13 15 8,4,2,1,3

21

A

RVORES BINÁRIAS

 Impressão em pré-ordem:

8

4 12

2

1 3

6

5 7

10 14

9 11 13 15 8,4,2,1,3,6

(12)

12

A

RVORES BINÁRIAS

 Impressão em pré-ordem:

8

4 12

2

1 3

6

5 7

10 14

9 11 13 15 8,4,2,1,3,6,5

23

A

RVORES BINÁRIAS

 Impressão em pré-ordem:

8

4 12

2

1 3

6

5 7

10 14

9 11 13 15 8,4,2,1,3,6,5,7

(13)

13

A

RVORES BINÁRIAS

 Impressão em pré-ordem:

8

4 12

2

1 3

6

5 7

10 14

9 11 13 15 8,4,2,1,3,6,5,7, 12

25

A

RVORES BINÁRIAS

 Impressão em pré-ordem:

8

4 12

2

1 3

6

5 7

10 14

9 11 13 15

8,4,2,1,3,6,5,7, 12,10

(14)

14

A

RVORES BINÁRIAS

 Impressão em pré-ordem:

8

4 12

2

1 3

6

5 7

10 14

9 11 13 15

8,4,2,1,3,6,5,7, 12,10,9

27

A

RVORES BINÁRIAS

 Impressão em pré-ordem:

8

4 12

2

1 3

6

5 7

10 14

9 11 13 15

8,4,2,1,3,6,5,7, 12,10,9,11

(15)

15

A

RVORES BINÁRIAS

 Impressão em pré-ordem:

8

4 12

2

1 3

6

5 7

10 14

9 11 13 15

8,4,2,1,3,6,5,7, 12,10,9,11,14

29

A

RVORES BINÁRIAS

 Impressão em pré-ordem:

8

4 12

2

1 3

6

5 7

10 14

9 11 13 15

8,4,2,1,3,6,5,7, 12,10,9,11,14,13

(16)

16

E

XERCÍCIO

 Qual a saída do caminhamento em pré ordem da árvore binária a seguir?

31

32

A

RVORES BINÁRIAS

 Impressão em ordem simétrica (E,R,D):

8

4 12

2

1 3

6

5 7

10 14

9 11 13 15

(17)

17

E

XERCÍCIO

 Qual a saída do percurso em ordem da árvore binária a seguir?

33

34

A

RVORES BINÁRIAS

 Impressão em pós-ordem (E,D,R):

8

4 12

2

1 3

6

5 7

10 14

9 11 13 15

(18)

18

E

XERCÍCIO

 Qual a saída do caminhamento em pós ordem da árvore binária a seguir?

35

Á

RVORE

B

INÁRIA

(I

MPLEMENTAÇÃO

)

De que é composta uma árvore binária?

Como implementar uma árvore binária?

(19)

19

Á

RVORE

B

INÁRIA

(I

MPLEMENTAÇÃO

)

De que é composta uma árvore binária?

Como implementar uma árvore binária?

public class BTNode<T> { protected T data;

protected BTNode<T> left; protected BTNode<T> right; protected BTNode<T> parent;

public boolean isEmpty(){ return this.data == null;

}

//getters, setters, equals, toString

}

37

Á

RVORE

B

INÁRIA

(I

MPLEMENTAÇÃO

)

De que é composta uma árvore binária?

Como implementar uma árvore binária?

public interface BT<T> { public BTNode<T> getRoot(); public boolean isEmpty(); public int height();

public BTNode<T> search(T elem); public void insert(T value);

public void remove(T key); public T[] preOrder(); public T[] order(); public T[] postOrder(); public int size();

}

(20)

20

Á

RVORE

B

INÁRIA

(I

MPLEMENTAÇÃO

)

 Como representar uma árvore vazia?

 O construtor default de BTNode já gera uma árvore vazia?

data = null

null null

null

39

Á

RVORE

B

INÁRIA

(I

MPLEMENTAÇÃO

)

 Como representar uma árvore vazia?

 O construtor default de BTNode já gera uma árvore vazia?

data = null

null null

null

=

NIL

O nó sentilena de uma árvore binária não contem dados

(21)

21

Á

RVORE

B

INÁRIA

(I

MPLEMENTAÇÃO

)

 Como representar uma árvore contendo apenas um nó?

data

NIL NIL

null

data

null

null

null null

null

null null

folha folha

41

Á

RVORE

B

INÁRIA DE

B

USCA

 Árvore binária de busca ou árvore binária de pesquisa é uma árvore bináriaonde todos os nós armazenam dados comparáveis

 todos nós da sub-árvore à esquerda contêm valores menores do que o nó raiz

 todos os nós da subárvore à direita contêm valores maiores do que o nó raiz.

 A principal utilização de árvores binárias são as árvores bináriade busca

x

< x > x

(22)

22

E

XEMPLO

2 Subárvores

>

>

>

<

<

O quanto isso reduz o espaço da busca a cada passo?

43

Á

RVORE

B

INÁRIA DE

B

USCA

(I

MPLEMENTAÇÃO

)

Uma BST é uma BT?

Como implementar isso em Java?

(23)

23

Á

RVORE

B

INÁRIA DE

B

USCA

(I

MPLEMENTAÇÃO

)

Uma BST é uma BT?

Como implementar isso em Java?

45

public class BSTNode<T extends Comparable<T>> extends BTNode<T> {

}

Á

RVORE

B

INÁRIA DE

B

USCA

(I

MPLEMENTAÇÃO

)

Uma BST é uma BT?

Como implementar isso em Java?

46

public interface BST<T extends Comparable<T>> extends BT<T> {

public BTNode<T> maximum(); public BTNode<T> minimum();

public BTNode<T> successor(BTNode<T> node); public BTNode<T> predecessor(BTNode<T> node);

(24)

24

P

ESQUISA

B

INÁRIA

Como saber se um dado/valor/chave está

na árvore?

 Se o nó é não-vazio

Verifica se o dado do nó é igual à chave dada

Se nao for

Se a chave dada for menor que o dado do nó, pesquisa na sub-árvore a esquerda

Senao pesquise na sub-árvore a direita

47

P

ESQUISA

B

INÁRIA

(I

MPLEMENTACAO

)

Qual o custo dos algoritmos?

(25)

25

Á

RVORE

D

ESBALANCEADA

 O que ocorre com a pesquisa binária se a árvore estiver desbalanceada?

42

88

94

95

x

< x

> x

49

Á

RVORE

D

ESBALANCEADA

 O que ocorre com a pesquisa binária se a árvore estiver desbalanceada?

42

88

94

95

O(n)

Solução: Outras árvores, como

AVL, que veremos depois.

x

< x

> x

(26)

26

M

INIMUM

Como buscar o elemento mínimo de uma

BST?

 Descer pela esquerda até que um NIL seja encontrado

51

M

AXIMUM

Como buscar o elemento máximo de uma

BST?

 Descer pela direita até que um NIL seja encontrado

(27)

27

S

UCESSOR

Como buscar o sucessor de um elemento

em uma BST?

 Sucessor é a menor das chaves maiores (menor descendente a direita)

53

S

UCESSOR

Como buscar o sucessor de um elemento

em uma BST?

 Sucessor é a menor das chaves maiores (primeiro ascendente maior)

(28)

28

P

REDECESSOR

Como buscar o predecessor de um

elemento em uma BST?

 Predecessor é a maior das chaves menores (maior descendente a esquerda). Simétrico ao sucessor

Tree-Predecessor(x) if left[x] != NIL

then return Tree-Maximum(left[x]) y = p[x]

while y != NIL and x = left[y] do x = y

y = p[y]

return y 55

P

REDECESSOR

Como buscar o predecessor de um

elemento em uma BST?

 Predecessor é a maior das chaves menores (primeiro ascendente maior). Simétrico ao sucessor

Tree-Predecessor(x) if left[x] != NIL

then return Tree-Maximum(left[x]) y = p[x]

while y != NIL and x = left[y] do x = y

y = p[y]

(29)

29

Á

RVORE

B

INÁRIA

(I

NSERÇÃO

)

 Acontece pela raiz (admitir elementos diferentes)

 Processar apenas chaves diferentes da raiz

 Se a chave for menor, insere no filho a esquerda

 Se a chave for maior insere no filho a direita

 Insercao sempre acontece em uma nova folha

57

E

XERCÍCIO

1

 Insira as chaves 46, 47, 44, 45

(30)

30

E

XERCÍCIO

1

 Insira as chaves 46, 47, 44, 45

59

46

E

XERCÍCIO

1

 Insira as chaves 46, 47, 44, 45

60

46

(31)

31

E

XERCÍCIO

1

 Insira as chaves 46, 47, 44, 45

61

46

47 44

E

XERCÍCIO

1

 Insira as chaves 46, 47, 44, 45

62

46

47 44

(32)

32

Á

RVORE

B

INÁRIA

(I

NSERCAO

)

 O procedimento recebe um nó mas poderia receber V

x guarda o nó onde inserir e

y guarda o pai

63

Á

RVORE

B

INÁRIA

(I

NSERCAO

)

 O procedimento recebe um nó mas poderia receber V

Para que serve?

(33)

33

Á

RVORE

B

INÁRIA

(I

NSERCAO

)

 O procedimento recebe um nó mas poderia receber V

Se a arvore é inicialmente vazia ou entao adiciona z como filho correto de y

65

Á

RVORE

B

INÁRIA

(I

NSERCAO

)

 O que o método a seguir faz?

XYZ(BSTNode node, T element){ if(node=NIL){

node.data = element node.left = NIL node.right = NIL }else{

if(element< node.data){ XYZ(node.left, element) }else if (element > node.data){ XYZ(node.right, element) }

} }

(34)

34

A

RVORES

B

INÁRIAS

(R

EMOCAO

)

 Remocoes em arvores binarias:

 Se o nó y (a ser removido) for uma folha entao remova-o.

 Se o nó y tem apenas um filho, então ligamos o pai de y ao filho de y

 Se tem dois filhos então traz o sucessor de y para o lugar dele e remove o sucessor

12

10 14

9 11 13 15

12

10 15

9 11 13 67

Á

RVORE

B

INÁRIA

(R

EMOÇÃO

)

tem ao maximo 1 filho

(35)

35

Á

RVORE

B

INÁRIA

(R

EMOÇÃO

)

Tem 2 filhos

69

Á

RVORE

B

INÁRIA

(R

EMOÇÃO

)

Guarda o filho a direita ou a esquerda

(36)

36

Á

RVORE

B

INÁRIA

(R

EMOÇÃO

)

Conecta o filho ao pai de y

71

Á

RVORE

B

INÁRIA

(R

EMOÇÃO

)

Se y é root entao x é novo root

(37)

37

Á

RVORE

B

INÁRIA

(R

EMOÇÃO

)

Senao seta x sendo o filho correto do pai de y

73

Á

RVORE

B

INÁRIA

(R

EMOÇÃO

)

Se o sucessor de z foi um nó diferente entao copia o conteudo dele para z.

(38)

38

A

RVORES

B

INÁRIAS

(R

EMOCAO

)

 Outras abordagens trabalham da seguinte forma:

 Se for folha remove

 Senao sobe o menor descendente a direita (sucessor)

 Se nao existir menor descendente a direita então sobe o maior descendente a esquerda (predecessor)

 Remove recursivamente o nó movido.

75

A

RVORES

B

INÁRIAS

(R

EMOCAO

)

76

(39)

39

A

RVORES

B

INÁRIAS

(R

EMOCAO

)

77

A

RVORES

B

INÁRIAS

(R

EMOCAO

)

78

(40)

40

A

RVORES

B

INÁRIAS

(R

EMOCAO

)

79

remover 30

40

A

RVORES

B

INÁRIAS

(R

EMOCAO

)

80

remover 50

(41)

41

A

RVORES

B

INÁRIAS

(R

EMOCAO

)

81

remover 90

40

90

A

RVORES

B

INÁRIAS

(R

EMOCAO

)

82

40

90

(42)

42

Á

RVORE

B

INÁRIA

(R

EMOCAO

)

if(node != NIL){ if(node is leaf){

node = NIL

}else if (node has one child){

if node != root if(node is left child){ if(node.left != NIL)

node.left is left child of node.parent else

node.right is left child of node.parent else //node is right child

if(node.left != NIL)

node.left is right child of parent else

node.right is right child of parent else

root = not NIL child of root

}else{

BSTNode sucessor = sucessor(node); node.value = sucessor.value; XYZ(sucessor);

}

} }

O que o metodo faz?

83

Á

RVORE

B

INÁRIA

(P

ERCURSO

)

 Algoritmo do percurso em pre-ordem

84

8

4 12

2

1 3

6

5 7

10 14

9 11 13 15

(43)

43

Á

RVORE

B

INÁRIA

(P

ERCURSO

)

 Algoritmo do percurso em pre-ordem

preOrder(BSTNode node){ if(node != NIL){

visit(node);

preOrder(node.left); preOrder(node.right); }

}

visit(BSTNode){ print(node.key); }

Poderia fazer qualquer outro processamento

85

Á

RVORE

B

INÁRIA

(P

ERCURSO

)

 Algoritmo do percurso em ordem

86

8

4 12

2

1 3

6

5 7

10 14

9 11 13 15

(44)

44

Á

RVORE

B

INÁRIA

(P

ERCURSO

)

 Algoritmo do percurso em ordem

order(BSTNode node){ if(node != NIL){ order(node.left); visit(node); order(node.right); }

}

87

Á

RVORE

B

INÁRIA

(P

ERCURSO

)

 Algoritmo do percurso em pós-ordem

88

8

4 12

2

1 3

6

5 7

10 14

9 11 13 15

(45)

45

Á

RVORE

B

INÁRIA

(P

ERCURSO

)

 Algoritmo do percurso em pós-ordem

postOrder(BSTNode node){ if(node != NIL){

postOrder(node.left); postOrder(node.right); visit(node);

} }

89

Á

RVORE

B

INÁRIA

 Como seria para calcular recursivamente o tamanho (quantidade de elementos) de uma árvore binária

90

1

size size

(46)

46

Á

RVORE

B

INÁRIA

 Como seria para calcular recursivamente o tamanho (quantidade de elementos) de uma árvore binária

int size(){

return size(root) }

int size(BSTNode node){ if(node.isEmpty) return 0 else

return 1 + size(node.left) + size(node.right) }

91

POSCOMP 2009

Nao necessariamente

balanceada!

(47)

47

POSCOMP 2009

93

POSCOMP 2009

(48)

48

POSCOMP 2009

95

R

EFERÊNCIAS

 Capítulo 13

Referências

Documentos relacionados