48
19/02/2013 1 ESTRUTURAS DE DADOS E ALGORITMOS ÁRVORE BINÁRIA Adalberto Cajueiro Departamento de Sistemas e Computação Universidade Federal de Campina Grande 1 ÁRVORE (EXEMPLO) 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 acesso mais eficiente. 2

Arvore Binaria de Busca (BST)

Embed Size (px)

Citation preview

Page 1: Arvore Binaria de Busca (BST)

19/02/2013

1

ESTRUTURAS DE DADOS E

ALGORITMOS

ÁRVORE BINÁRIA Adalberto Cajueiro

Departamento de Sistemas e Computação

Universidade Federal de Campina Grande

1

ÁRVORE (EXEMPLO)

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

acesso mais eficiente. 2

Page 2: Arvore Binaria de Busca (BST)

19/02/2013

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 (ILUSTRACAO)

raiz

...

raiz

root

4

Page 3: Arvore Binaria de Busca (BST)

19/02/2013

3

ÁRVORE (ILUSTRACAO)

raiz

...

folha (leaf)

5

6

ÁRVORE

raiz

...

Nível 0

Nível 1

Nível k

Nível k + 1

Altura = k+1

Page 4: Arvore Binaria de Busca (BST)

19/02/2013

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

8

Page 5: Arvore Binaria de Busca (BST)

19/02/2013

5

ÁRVORE (APLICABILIDADE)

Representacao de expressoes aritméticas

5*3 + 4/2

+

* /

5 3 4 2

9

EXERCÍ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?

10

Page 6: Arvore Binaria de Busca (BST)

19/02/2013

6

ÁRVORES ESTRITAMENTE BINÁ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

EXERCÍCIO

A árvore a seguir é estritamente binária?

Justifique.

12

Page 7: Arvore Binaria de Busca (BST)

19/02/2013

7

ÁRVORE BINÁRIA COMPLETA

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 BINÁRIA COMPLETA

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

14

Page 8: Arvore Binaria de Busca (BST)

19/02/2013

8

ÁRVORES BINÁRIAS (PERCURSOS)

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

ARVORES 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

16

Page 9: Arvore Binaria de Busca (BST)

19/02/2013

9

ARVORES BINÁRIAS

Impressão em pré-ordem:

8

4 12

2

1 3

6

5 7

10 14

9 11 13 15

8

17

ARVORES BINÁRIAS

Impressão em pré-ordem:

8

4 12

2

1 3

6

5 7

10 14

9 11 13 15

8,4

18

Page 10: Arvore Binaria de Busca (BST)

19/02/2013

10

ARVORES 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

ARVORES 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

20

Page 11: Arvore Binaria de Busca (BST)

19/02/2013

11

ARVORES 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

ARVORES 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

22

Page 12: Arvore Binaria de Busca (BST)

19/02/2013

12

ARVORES 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

ARVORES 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

24

Page 13: Arvore Binaria de Busca (BST)

19/02/2013

13

ARVORES 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

ARVORES 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

26

Page 14: Arvore Binaria de Busca (BST)

19/02/2013

14

ARVORES 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

ARVORES 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

28

Page 15: Arvore Binaria de Busca (BST)

19/02/2013

15

ARVORES 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

ARVORES 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

30

Page 16: Arvore Binaria de Busca (BST)

19/02/2013

16

EXERCÍCIO

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

31

32

ARVORES 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

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

10,11,12,13,14,15

Page 17: Arvore Binaria de Busca (BST)

19/02/2013

17

EXERCÍCIO

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

33

34

ARVORES 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

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

13,15,14,12,8

Page 18: Arvore Binaria de Busca (BST)

19/02/2013

18

EXERCÍCIO

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

35

ÁRVORE BINÁRIA (IMPLEMENTAÇÃO)

De que é composta uma árvore binária?

Como implementar uma árvore binária?

36

Page 19: Arvore Binaria de Busca (BST)

19/02/2013

19

ÁRVORE BINÁRIA (IMPLEMENTAÇÃ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 BINÁRIA (IMPLEMENTAÇÃ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();

}

38

Page 20: Arvore Binaria de Busca (BST)

19/02/2013

20

ÁRVORE BINÁRIA (IMPLEMENTAÇÃO)

Como representar uma árvore vazia?

O construtor default de BTNode já gera uma

árvore vazia?

data = null

null null

null

39

ÁRVORE BINÁRIA (IMPLEMENTAÇÃ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

40

Page 21: Arvore Binaria de Busca (BST)

19/02/2013

21

ÁRVORE BINÁRIA (IMPLEMENTAÇÃ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 BINÁRIA DE BUSCA

Árvore binária de busca ou árvore binária de

pesquisa é uma árvore binária onde 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ária de busca

x

< x > x

42

Page 22: Arvore Binaria de Busca (BST)

19/02/2013

22

EXEMPLO

2 Subárvores >

> >

<

<

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

43

ÁRVORE BINÁRIA DE BUSCA

(IMPLEMENTAÇÃO)

Uma BST é uma BT?

Como implementar isso em Java?

44

Page 23: Arvore Binaria de Busca (BST)

19/02/2013

23

ÁRVORE BINÁRIA DE BUSCA

(IMPLEMENTAÇÃO)

Uma BST é uma BT?

Como implementar isso em Java?

45

public class BSTNode<T extends Comparable<T>>

extends BTNode<T> {

}

ÁRVORE BINÁRIA DE BUSCA

(IMPLEMENTAÇÃ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);

}

Page 24: Arvore Binaria de Busca (BST)

19/02/2013

24

PESQUISA BINÁ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

PESQUISA BINÁRIA (IMPLEMENTACAO)

Qual o custo dos algoritmos?

48

Page 25: Arvore Binaria de Busca (BST)

19/02/2013

25

ÁRVORE DESBALANCEADA

O que ocorre com a pesquisa binária se a árvore

estiver desbalanceada?

42

88

94

95

x

< x

> x

49

ÁRVORE DESBALANCEADA

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

50

Page 26: Arvore Binaria de Busca (BST)

19/02/2013

26

MINIMUM

Como buscar o elemento mínimo de uma

BST?

Descer pela esquerda até que um NIL seja

encontrado

51

MAXIMUM

Como buscar o elemento máximo de uma

BST?

Descer pela direita até que um NIL seja

encontrado

52

Page 27: Arvore Binaria de Busca (BST)

19/02/2013

27

SUCESSOR

Como buscar o sucessor de um elemento

em uma BST?

Sucessor é a menor das chaves maiores (menor

descendente a direita)

53

SUCESSOR

Como buscar o sucessor de um elemento

em uma BST?

Sucessor é a menor das chaves maiores

(primeiro ascendente maior)

54

Page 28: Arvore Binaria de Busca (BST)

19/02/2013

28

PREDECESSOR

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

PREDECESSOR

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]

return y 56

Page 29: Arvore Binaria de Busca (BST)

19/02/2013

29

ÁRVORE BINÁRIA (INSERÇÃ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

EXERCÍCIO 1

Insira as chaves 46, 47, 44, 45

58

Page 30: Arvore Binaria de Busca (BST)

19/02/2013

30

EXERCÍCIO 1

Insira as chaves 46, 47, 44, 45

59

46

EXERCÍCIO 1

Insira as chaves 46, 47, 44, 45

60

46

47

Page 31: Arvore Binaria de Busca (BST)

19/02/2013

31

EXERCÍCIO 1

Insira as chaves 46, 47, 44, 45

61

46

47 44

EXERCÍCIO 1

Insira as chaves 46, 47, 44, 45

62

46

47 44

45

Page 32: Arvore Binaria de Busca (BST)

19/02/2013

32

ÁRVORE BINÁRIA (INSERCAO)

O procedimento recebe um nó mas poderia receber V

x guarda o nó onde inserir

e

y guarda o pai

63

ÁRVORE BINÁRIA (INSERCAO)

O procedimento recebe um nó mas poderia receber V

Para que serve?

64

Page 33: Arvore Binaria de Busca (BST)

19/02/2013

33

ÁRVORE BINÁRIA (INSERCAO)

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 BINÁRIA (INSERCAO)

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)

}

}

} 66

Page 34: Arvore Binaria de Busca (BST)

19/02/2013

34

ARVORES BINÁRIAS (REMOCAO)

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 BINÁRIA (REMOÇÃO)

tem ao maximo 1 filho

68

Page 35: Arvore Binaria de Busca (BST)

19/02/2013

35

ÁRVORE BINÁRIA (REMOÇÃO)

Tem 2 filhos

69

ÁRVORE BINÁRIA (REMOÇÃO)

Guarda o filho a direita

ou a esquerda

70

Page 36: Arvore Binaria de Busca (BST)

19/02/2013

36

ÁRVORE BINÁRIA (REMOÇÃO)

Conecta o filho ao pai de y

71

ÁRVORE BINÁRIA (REMOÇÃO)

Se y é root entao x é novo root

72

Page 37: Arvore Binaria de Busca (BST)

19/02/2013

37

ÁRVORE BINÁRIA (REMOÇÃO)

Senao seta x sendo o filho

correto do pai de y

73

ÁRVORE BINÁRIA (REMOÇÃO)

Se o sucessor de z foi um

nó diferente entao copia

o conteudo dele para z.

74

Page 38: Arvore Binaria de Busca (BST)

19/02/2013

38

ARVORES BINÁRIAS (REMOCAO)

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

ARVORES BINÁRIAS (REMOCAO)

76

remover 20

Page 39: Arvore Binaria de Busca (BST)

19/02/2013

39

ARVORES BINÁRIAS (REMOCAO)

77

ARVORES BINÁRIAS (REMOCAO)

78

remover 30

Page 40: Arvore Binaria de Busca (BST)

19/02/2013

40

ARVORES BINÁRIAS (REMOCAO)

79

remover 30

40

ARVORES BINÁRIAS (REMOCAO)

80

remover 50

40

Page 41: Arvore Binaria de Busca (BST)

19/02/2013

41

ARVORES BINÁRIAS (REMOCAO)

81

remover 90

40

90

ARVORES BINÁRIAS (REMOCAO)

82

40

90

100

Page 42: Arvore Binaria de Busca (BST)

19/02/2013

42

ÁRVORE BINÁRIA (REMOCAO)

XYZ(value) {

BSTNode node = search(value)

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 BINÁRIA (PERCURSO)

Algoritmo do percurso em pre-ordem

84

8

4 12

2

1 3

6

5 7

10 14

9 11 13 15

Como seria o algoritmo?

Page 43: Arvore Binaria de Busca (BST)

19/02/2013

43

ÁRVORE BINÁRIA (PERCURSO)

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 BINÁRIA (PERCURSO)

Algoritmo do percurso em ordem

86

8

4 12

2

1 3

6

5 7

10 14

9 11 13 15

Como seria o algoritmo?

Page 44: Arvore Binaria de Busca (BST)

19/02/2013

44

ÁRVORE BINÁRIA (PERCURSO)

Algoritmo do percurso em ordem

order(BSTNode node){

if(node != NIL){

order(node.left);

visit(node);

order(node.right);

}

}

87

ÁRVORE BINÁRIA (PERCURSO)

Algoritmo do percurso em pós-ordem

88

8

4 12

2

1 3

6

5 7

10 14

9 11 13 15

Como seria o algoritmo?

Page 45: Arvore Binaria de Busca (BST)

19/02/2013

45

ÁRVORE BINÁRIA (PERCURSO)

Algoritmo do percurso em pós-ordem

postOrder(BSTNode node){

if(node != NIL){

postOrder(node.left);

postOrder(node.right);

visit(node);

}

}

89

ÁRVORE BINÁRIA

Como seria para calcular recursivamente o

tamanho (quantidade de elementos) de uma

árvore binária

90

1

size size

size(root) = 1 + size(left) + size(right)

Page 46: Arvore Binaria de Busca (BST)

19/02/2013

46

ÁRVORE BINÁ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!

92

Page 47: Arvore Binaria de Busca (BST)

19/02/2013

47

POSCOMP 2009

93

POSCOMP 2009

94

Page 48: Arvore Binaria de Busca (BST)

19/02/2013

48

POSCOMP 2009

95

REFERÊNCIAS

Capítulo 13

96