Arvore Binaria de Busca (BST)

Post on 02-Dec-2015

127 views 6 download

Transcript of 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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);

}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

19/02/2013

39

ARVORES BINÁRIAS (REMOCAO)

77

ARVORES BINÁRIAS (REMOCAO)

78

remover 30

19/02/2013

40

ARVORES BINÁRIAS (REMOCAO)

79

remover 30

40

ARVORES BINÁRIAS (REMOCAO)

80

remover 50

40

19/02/2013

41

ARVORES BINÁRIAS (REMOCAO)

81

remover 90

40

90

ARVORES BINÁRIAS (REMOCAO)

82

40

90

100

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?

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?

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?

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)

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

19/02/2013

47

POSCOMP 2009

93

POSCOMP 2009

94

19/02/2013

48

POSCOMP 2009

95

REFERÊNCIAS

Capítulo 13

96