Árvores binárias de busca -...

65
José Augusto Baranauskas Departamento de Física e Matemática – FFCLRP-USP [email protected] http://dfm.ffclrp.usp.br/~augusto Algoritmos e Estruturas de Dados I Árvores Binárias de Busca Árvores Binárias de Busca Nesta aula será apresentado o ADT árvore binária de busca, também conhecidas como dicionários binários Uma árvore binária de busca é uma estrutura de dados não linear utilizada para acesso rápido aos dados

Upload: others

Post on 07-Aug-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

José Augusto BaranauskasDepartamento de Física e Matemática – FFCLRP-USP

[email protected]://dfm.ffclrp.usp.br/~augusto

Algoritmos eEstruturas de Dados I

Árvores Binárias de BuscaÁrvores Binárias de Busca

Nesta aula será apresentado o ADT árvore binária de busca, também conhecidas como dicionários bináriosUma árvore binária de busca é uma estrutura de dados não linear utilizada para acesso rápido aos dados

Page 2: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

2

Árvore Binária de Busca (ABB)Árvore Binária de Busca (ABB)

Uma ABB é uma AB tal que para todo nó x:Todos elementos chaves da subárvore esquerda de xsão menores que a chave xTodos elementos chaves da subárvore direita de x são maiores que a chave xAs subárvores esquerda e direita também são ABB

ABB são também conhecidas como dicionários bináriosUm campo chave (key) é um dado de identifica univocamente uma informação

RG, CPF, fragmento de DNA (tag), gene symbol

Page 3: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

3

Árvore Binária de Busca (ABB)Árvore Binária de Busca (ABB)

5

3 8

61 4 9

7

Page 4: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

4

EspecificaçãoEspecificação

Operações:CriaçãoDestruiçãoStatusOperações Básicas

Page 5: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

5

CriaçãoCriação

BinarySearchTree::BinarySearchTree();pré-condição: nenhumapós-condição: Árvore binária é criada e iniciada como vazia

Page 6: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

6

DestruiçãoDestruição

BinarySearchTree::~BinarySearchTree();pré-condição: Árvore binária já tenha sido criadapós-condição: Árvore binária é destruída, liberando espaço ocupado pelo seus elementos

Page 7: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

7

StatusStatus

bool BinarySearchTree::Empty();pré-condição: Árvore binária já tenha sido criadapós-condição: função retorna true se a árvore binária está vazia; false caso contrário

Page 8: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

8

StatusStatus

bool BinarySearchTree::Full();pré-condição: Árvore binária já tenha sido criadapós-condição: função retorna true se a árvore binária está cheia; false caso contrário

Page 9: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

9

Operações BásicasOperações Básicas

void BinarySearchTree::Insert(TreeEntry x);pré-condição: Árvore binária já tenha sido criada, não está cheiapós-condição: O item x é armazenado na árvore binária

O tipo TreeEntry depende da aplicação e pode variar

desde um simples caracter ounúmero até uma struct ouclass com muitos campos

Page 10: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

10

Operações BásicasOperações Básicas

void BinarySearchTree::Delete(TreeEntry x);pré-condição: Árvore binária já tenha sido criada, não está vazia e o item x pertence à árvore bináriapós-condição: O item x é removido da árvore binária

Page 11: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

11

Operações BásicasOperações Básicas

bool BinarySearchTree::Search(TreeEntry x);pré-condição: Árvore binária já tenha sido criadapós-condição: Retorna true se x foi encontrado na árvore binária; false caso contrário

Page 12: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

12

Operações BásicasOperações Básicas

TreeEntry BinarySearchTree::Minimum()pré-condição: Árvore binária já tenha sido criada e não está vaziapós-condição: Retorna o valor mínimo encontrado na árvore binária

Page 13: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

13

Operações BásicasOperações Básicas

TreeEntry BinarySearchTree::Maximum()pré-condição: Árvore binária já tenha sido criada e não está vaziapós-condição: Retorna o valor máximo encontrado na árvore binária

Page 14: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

14

Outras OperaçõesOutras Operações

void BinarySearchTree::Clear();pré-condição: Árvore binária já tenha sido criadapós-condição: todos os itens da árvore binária são descartados e ela torna-se uma árvore binária vazia

Page 15: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

15

QuestãoQuestão

Utilize estas idéias para escrever uma declaração de tipo que poderia implementar uma árvore binária para armazenar valores inteiros.

Você tem 5 minutospara escrever a declaração

Page 16: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

16

Uma SoluçãoUma Solução

class BinarySearchTree{ public:

BinarySearchTree();~BinarySearchTree();void Insert(int x);void Delete(int x);bool Search(int x);…

private:// declaração de tiposstruct TreeNode{ int Entry; // tipo de dado colocado na árvore

TreeNode *LeftNode, *RightNode; // subárvores};typedef TreeNode *TreePointer;

// declaração de camposTreePointer root;

};

Page 17: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

17

Uma SoluçãoUma Solução

class BinarySearchTree{ public:

BinarySearchTree();~BinarySearchTree();void Insert(int x);void Delete(int x);bool Search(int x);…

private:// declaração de tiposstruct TreeNode{ int Entry; // tipo de dado colocado na árvore

TreeNode *LeftNode, *RightNode; // subárvores};typedef TreeNode *TreePointer;

// declaração de camposTreePointer root;

};

Observe que o tipoTreeEntry nesse caso éum inteiro

Page 18: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

18

Construtor Construtor

BinarySearchTree::BinarySearchTree()

A ABB deve iniciar vazia, cuja convenção é a raiz estar aterrada

root BinarySearchTree::BinarySearchTree()

{

root = NULL;

}

Page 19: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

19

Destruidor Destruidor

BinarySearchTree::~BinarySearchTree()

O destruidor deve retirar todos os elementos da ABB. Faremos uma chamada ao métodoClear para isso

BinarySearchTree::~BinarySearchTree(){Clear();

}

root

A

B C

D

Page 20: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

20

Status: Status: EmptyEmpty

bool BinarySearchTree::Empty()

Lembre-se que a ABB iniciavazia, com root = NULL...

bool BinarySearchTree::Empty()

{

return (root == NULL);

}

root

Page 21: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

21

Status: Status: FullFull

bool BinarySearchTree::Full()

...e que não há limite quanto ao númeromáximo de elementos da AB

bool BinarySearchTree::Full()

{

return false;

}

root

A

B C

D

Page 22: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

22

Mínimo e MáximoMínimo e Máximo

O elemento mínimo em uma ABB pode ser encontrado seguindo-se as subárvoresesquerdas desde a raizO elemento máximo em uma ABB pode ser encontrado seguindo-se as subárvoresdireitas desde a raiz

Page 23: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

23

Mínimo e MáximoMínimo e Máximo

5

3 8

61 4 9

7 MáximoMínimo

Page 24: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

24

Operações Básicas: MínimoOperações Básicas: Mínimo

int BinarySearchTree::Minimum(){ TreePointer t=root;

if(t == NULL){ cout << “Árvore vazia” << endl;abort();

}while (t->LeftNode != NULL)

t = t->LeftNode; // procurar subárvore esquerda

return t->Entry;}

Page 25: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

25

Operações Básicas: MáximoOperações Básicas: Máximo

int BinarySearchTree::Maximum(){ TreePointer t=root;

if(t == NULL){ cout << “Árvore vazia” << endl;abort();

}while (t->RightNode != NULL)

t = t->RightNode; // procurar subárvore direita

return t->Entry;}

Page 26: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

26

Busca em ABBBusca em ABB

Como já visto, n elementos podem ser organizados em uma árvore de altura mínima h ≈ log2 nPortanto, uma busca entre nelementos pode ser realizada com apenas O(h)=O(log2 n) comparações se a árvore estiver perfeitamente balanceada

Page 27: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

27

Busca em ABBBusca em ABB

A vantagem da ABB é que sempre é suficiente realizar a busca em, no máximo, uma das subárvoresPara encontrar um elemento x na ABB

Se x é a raiz da ABB então x foi encontrado, caso contrárioSe x é menor que a raiz então procure x na sub-árvore esquerda, caso contrárioProcure x na sub-árvore direita deSe a ABB é vazia então a busca falha

5

3 8

61 4 9

7 Elemento 6 é encontradoseguindo o caminho 5-8-6

Page 28: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

28

Busca de x = 6Busca de x = 6

5

3 8

61 4 9

7

Como x > 5, procurar x na

subárvoredireita

Page 29: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

29

Busca de x = 6Busca de x = 6

5

3 8

61 4 9

7

Page 30: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

30

Busca de x = 6Busca de x = 6

5

3 8

61 4 9

7

Como x < 8, procurar x na

subárvoreesquerda

Page 31: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

31

Busca de x = 6Busca de x = 6

5

3 8

61 4 9

7

Page 32: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

32

Busca de x = 6Busca de x = 6

5

3 8

61 4 9

7 Como x = 6, o elemento x foi encontrado na

árvore

Page 33: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

33

Busca de x = 2Busca de x = 2

5

3 8

61 4 9

7

Como x < 5, procurar x na

subárvoreesquerda

Page 34: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

34

Busca de x = 2Busca de x = 2

5

3 8

61 4 9

7

Page 35: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

35

Busca de x = 2Busca de x = 2

5

3 8

61 4 9

7

Como x < 3, procurar x na

subárvoreesquerda

Page 36: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

36

Busca de x = 2Busca de x = 2

5

3 8

61 4 9

7

Page 37: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

37

Busca de x = 2Busca de x = 2

5

3 8

61 4 9

7 Como x > 1, procurar x na

subárvoredireita

Page 38: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

38

Busca de x = 2Busca de x = 2

5

3 8

61 4 9

7 Como a subárvoredireita do nó 1 é

vazia, a busca falhou

Page 39: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

39

Operações Básicas: Operações Básicas: SearchSearch(versão iterativa)(versão iterativa)bool BinarySearchTree::ISearch(int x){ TreePointer t=root;

while (t != NULL && t->Entry != x) if(x < t->Entry)t = t->LeftNode; // procurar subárvore esquerda

elset = t->RightNode; // procurar subárvore direita

return (t != NULL);}

Page 40: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

40

Operações Básicas: Operações Básicas: SearchSearch(versão recursiva)(versão recursiva)bool BinarySearchTree::RSearch(int x, TreePointer &t){

if(t == NULL)return false; // x não encontrado

if(x < t->Entry)return RSearch(x,t->LeftNode);

elseif(x > t->Entry)return RSearch(x,t->RightNode);

else // x == t->Entryreturn true;

}

Page 41: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

41

Operações Básicas: Operações Básicas: SearchSearch

Busca Iterativabool BinarySearchTree::

Search(int x){

return ISearch(x);

}

Busca Recursivabool BinarySearchTree::

Search(int x){

return RSearch(x, root);

}

Page 42: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

42

Inserção em ABBInserção em ABB

Para adicionar um elemento x a uma ABBSe a árvore estiver vazia, adicione um novo nó contendo o elemento xSe a raiz é maior que x então insira x na subárvore esquerda, caso contrário insira x na subárvore direita

Veremos a implementação iterativa; a implementação da versão recursiva é deixada como exercício

Page 43: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

43

Inserção em ABBInserção em ABB

5

3 8

64

7

5

3 8

5

3 8

6

5

3 8

6

7

x = 6 x = 7 x = 4

Page 44: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

44

Inserção de x = 7Inserção de x = 7

5

3 8

6

rootqp

Como x > 5, x deve ser

inserido na subárvore direita

O ponteiro p fica sempre uma posição atrás de q, ou seja,p é o pai de q

Page 45: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

45

Inserção de x = 7Inserção de x = 7

5

3 8

6

root

Como x < 8, x deve ser inserido

na subárvoreesquerda

O ponteiro p fica sempre uma posição atrás de q, ou seja,p é o pai de q

p

q

Page 46: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

46

Inserção de x = 7Inserção de x = 7

5

3 8

6

root

Como x > 7, x deve ser inserido

na subárvoredireita

O ponteiro p fica sempre uma posição atrás de q, ou seja,p é o pai de q

q

p

Page 47: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

47

Inserção de x = 7Inserção de x = 7

5

3 8

6

root

Como x > 6, x deve ser inserido

na subárvoredireita

q

p

O ponteiro p fica sempre uma posição atrás de q, ou seja,p é o pai de q

Page 48: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

48

Inserção de x = 7Inserção de x = 7

5

3 8

6

7

root

Como x > 6, x deve ser inserido

na subárvoredireita

Assuma r como sendo um ponteiro para o novo nó a ser inserido:

if(x < p->Entry)…

p

r q

Page 49: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

49

Inserção de x = 7Inserção de x = 7

5

3 8

6

7

root

Assuma r como sendo um ponteiro para o novo nó a ser inserido:

if(x < p->Entry)p->LeftNode = r;

elsep->RightNode = r;

p

r q

Page 50: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

50

Inserção de x = 5Inserção de x = 5

rootqp

Entretanto, se a árvore estiver vazia:

if(p == NULL)...

5r

Page 51: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

51

Inserção de x = 5Inserção de x = 5

rootqp

Entretanto, se a árvore estiver vazia:

if(p == NULL)root = r;

5r

Page 52: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

52

Operações Básicas: Operações Básicas: InsertInsert

void BinarySearchTree::Insert(int x)

{ TreePointer p=NULL, q=root, r;

while (q != NULL) { p = q; if(x < q->Entry)q = q->LeftNode;

elseq = q->RightNode;

}

r = new TreeNode;r->Entry = x;r->LeftNode = NULL;r->RightNode = NULL;

if(p == NULL)root = r; // árvore vazia

elseif(x < p->Entry)

p->LeftNode = r;else

p->RightNode = r;

}

Page 53: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

53

Remoção em ABBRemoção em ABB

Para remover um elemento x a uma ABB há três situações possíveis:

Não existe nenhum nó com chave igual a xO nó com chave x possui, no máximo, uma das subárvoresO nó com chave x possui as duas subárvores

Page 54: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

54

Remoção em ABBRemoção em ABB

x = 40 x = 30

15

3 30

201 4 40

18 25 35

32 36

15

3 30

201 4

18 25

35

32 36

15

3 32

201 4

18 25

35

36

Page 55: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

55

Remoção em ABBRemoção em ABB

x = 32 x = 15 x = 25

15

3 35

201 4

18 25

36

15

3 32

201 4

18 25

35

36

18

3 35

201 4

25

36

18

3 35

201 4 36

Page 56: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

56

Remoção em ABBRemoção em ABBA

X

R

A

RRemover X

A

X

L

A

LRemover X

A

X

L R

A

?

L R

Remover X

Page 57: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

57

Remoção em ABBRemoção em ABB

X

L R

Y

L R1L RY

Remover X Transferir Y

X

L R

Y

L1 RL RY

Remover X Transferir Y

Page 58: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

58

Remoção em ABBRemoção em ABB

Dessa forma, quando o elemento x sendo removido possui as duas subárvores não vazias, há duas estratégias possíveis para substituir o valor de x, preservando as propriedades de ABB

Encontrar o elemento de menor valor y na subárvoredireita de x de transferi-lo para o nó ocupado por xEncontrar o elemento de maior valor y na subárvoreesquerda de x de transferi-lo para o nó ocupado por x

É óbvio que, após a transferência, o nó y deve ser removido da árvore em ambas as estratégiasAdotaremos a primeira estratégia, ficando a segunda como exercício

Page 59: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

59

Remoção em ABBRemoção em ABB

Definiremos dois métodos auxiliares privados para a remoção em ABB

Delete(int x, TreePointer &p)DelMin(TreePointer &q,TreePointer &r)

O primeiro método deve ser chamado passando a raiz (root) como o parâmetro pO segundo método procura, na subárvoredireita, pelo menor valor e só é chamando quando o nó com chave x possui as duas subárvores

Page 60: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

60

Remoção em ABBRemoção em ABBvoid BinarySearchTree::Delete(int x){ Delete(x,root);}//-----------------------------------------------void BinarySearchTree::Delete(int x,

TreePointer &p){ TreePointer q;

if(p == NULL){ cout << “Elemento inexistente”;

abort();}if(x < p->Entry)

Delete(x,p->LeftNode);else

if(x > p->Entry)Delete(x,p->RightNode);

else // remover p->{ q = p;

if(q->RightNode == NULL)p = q->LeftNode;

elseif(q->LeftNode == NULL)

p = q->RightNode;else

DelMin(q,q->RightNode);delete q;

}}

Page 61: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

61

Remoção em ABBRemoção em ABB

void BinarySearchTree::DelMin(TreePointer &q,TreePointer &r)

{if(r->LeftNode != NULL)DelMin(q,r->LeftNode);

else{ q->Entry = r->Entry;

q = r;r = r->RightNode;

}}

Page 62: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

62

Busca com InserçãoBusca com Inserção

Vamos considerar a situação em que, caso um elemento não se encontre na árvore, então ele deve ser inserido; caso já esteja, um contador deve ser atualizadoUm exemplo típico é a contagem do número de palavras em um textoPara tanto, nossa estrutura de dados será estendida para a seguinte definição

struct TreeNode{ string Entry; // chave

int count;TreeNode *LeftNode, *RightNode;

};

Page 63: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

63

Busca com InserçãoBusca com Inserçãovoid BinarySearchTree::SearchInsert(int x){ SearchInsert(x,root);}//-----------------------------------------------------------------------------void BinarySearchTree::SearchInsert(int x, TreePointer &t){ if(t == NULL) // x não encontrado; inserir

{ t = new TreeNode;t->Entry = x;t->count = 1;t->LeftNode = t->RightNode = NULL;

}else

if(x < t->Entry) // procurar x na subárvore esquerdaSearchInsert(x,t->LeftNode);

elseif(x > t->Entry) // procurar x na subárvore direita

SearchInsert(x,t->RightNode);else // x encontrado, atualizar contador

t->count++;}

Page 64: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

64

Considerações FinaisConsiderações Finais

Como vimos, em uma ABB perfeitamente balanceada com n nós e altura h, os algoritmos de busca e inserção tomam tempo O(h) = O(log2n)Entretanto, uma árvore pode se degenerar em uma lista

No pior caso os algoritmos levam O(n)Em média O(n/2)

A situação no pior caso conduz a um desempenho muito pobreVeremos na próxima apresentação uma forma de garantir tempo O(log2 n), mesmo no pior caso

Page 65: Árvores Binárias de Busca - DCMdcm.ffclrp.usp.br/~augusto/teaching/aedi/AED-I-Arvores-Binarias-Bus… · binária de busca, também conhecidas como dicionários binários Uma árvore

65

Slides baseados em:

Horowitz, E. & Sahni, S.;Fundamentos de Estruturas de Dados,

Editora Campus, 1984.

Wirth, N.; Algoritmos e Estruturas de Dados, Prentice/Hall do Brasil, 1989.

Material elaborado porJosé Augusto Baranauskas2004; Revisão atual 2007