A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Prof. Hilton Cardoso Marins Junior

Apresentações semelhantes


Apresentação em tema: "Prof. Hilton Cardoso Marins Junior"— Transcrição da apresentação:

1 Prof. Hilton Cardoso Marins Junior hiltonmarins@gmail.com
ÁRVORES BINÁRIAS DE BUSCA

2 Propriedade fundamental da Árvore Binária de Busca
Valor da chave da raiz é maior do que o valor da chave da subárvore da esquerda (SAE) e menor do que o valor da chave da subárvore da direita (SAD). A subárvore da esquerda e subárvore da direita obedecem a propriedade fundamental. 20 10 30 8 15 25 33 6 9 14 18

3 Operações com Árvore Binária de Busca
Muitas funções, analisadas anteriormente, podem ser aproveitadas para árvores binárias de busca, como por exemplo as funções de inicialização, de criação de nós, verificação se a árvore está vazia e as funções de percurso. Analisaremos, em detalhes, algumas funções que exploram a propriedade de ordenação das árvores binárias de busca: Busca um elemento na árvore; Insere um novo elemento na árvore; Remove um elemento da árvore.

4 Operação de BUSCA - Árvore Binária de Busca
De uma forma simplificada a busca em uma árvore binária de busca pode ser resumida em: Compara-se o valor com a raiz Se igual, achou Se maior, então buscar na subárvore da direita (SAD) Se menor, então buscar na subárvore da esquerda (SAE) 1o 2o

5 Operação de BUSCA - Árvore Binária de Busca
Chamada para buscar um valor a partir do nó raiz Comparação com valor do nó raiz. Se igual, achou: Retornar verdadeiro. Se valor é menor que o valor do nó da raiz e Possui SAE: Chamada recursiva para nó raiz de SAE. Não possui SAE: Retornar falso. Se valor é maior que o valor do nó da raiz e Possui SAD: Chamada recursiva para nó raiz de SAD. Não possui SAD:

6 Exemplo de BUSCA - Árvore Binária de Busca
Qual o caminho percorrido para a chave 18? 20 10 30 8 15 25 33 6 9 14 18

7 Exemplo de BUSCA - Árvore Binária de Busca
Qual o caminho percorrido para a chave 18? 20 10 30 8 15 25 33 6 9 14 18

8 Exemplo de BUSCA - Árvore Binária de Busca
Qual o caminho percorrido para buscar a chave 11? 20 10 30 8 15 25 33 6 9 14 18

9 Exemplo de BUSCA - Árvore Binária de Busca
Qual o caminho percorrido para buscar a chave 11? 20 10 30 8 15 25 33 6 9 14 18

10 /* Busca por uma informação na árvore. */
int busca(Arvore* a, int c){ if(vazia(a)){ /* foi até o final e não achou.*/ return 0; }else{ if (a->info == c){ /* indica que achou.*/ return 1; if (c < a->info){ return busca(a->sae, c); if (c > a->info){ return busca(a->sad, c); }

11 Exemplo de BUSCA - Árvore Binária de Busca
Indicar o caminho percorrido para encontrar os nós: – 10 – 15 – 13 – 11 8 20 – 10 – 8 – 30 – 20 20 – 30 – 33 – 39 – 90 20 10 30 8 15 25 33 6 9 13 18 31 39 1 7 11 12 36 90 O número de comparações em um árvore é proporcional a altura da árvore.

12 Operação de INSERÇÃO - Árvore Binária de Busca
Devemos inserir o novo nó como filho do nó folha mantendo a propriedade da árvore binária de busca. nó folha f null null f f n null null n novo nó novo nó Chave do novo nó < Chave do nó folha Chave do novo nó > Chave do nó folha

13 Exemplo de INSERÇÃO - Árvore Binária de Busca
Inserir as chaves: 34, 20, 40, 36 e 37 34

14 Exemplo de INSERÇÃO - Árvore Binária de Busca
Inserir as chaves: 34, 20, 40, 36 e 37 34 20

15 Exemplo de INSERÇÃO - Árvore Binária de Busca
Inserir as chaves: 34, 20, 40, 36 e 37 34 20 40

16 Exemplo de INSERÇÃO - Árvore Binária de Busca
Inserir as chaves: 34, 20, 40, 36 e 37 34 20 40 36

17 Exemplo de INSERÇÃO - Árvore Binária de Busca
Inserir as chaves: 34, 20, 40, 36 e 37 34 20 40 36 37

18 /* Insere um nó na árvore binária. */
Arvore* inserir(Arvore* a, int c){ if (vazia(a)){ return criaNo(c, inicializa(), inicializa()); }else{ if (c < a->info){ a->esq = inserir(a->sae, c); a->dir = inserir(a->sad, c); } return a;

19 Operação de REMOÇÃO - Árvore Binária de Busca
Na remoção de um nó da árvore binária de busca, o nível de complexidade depende da posição do nó a ser removido da árvore, pois após a remoção a árvore deve preservar sua propriedade fundamental. A dificuldade maior está em remover o nó que tem duas subárvores. Há três casos possíveis, o a ser removido: 1) é uma folha (não tem filhos) 2) tem 1 filho 3) tem 2 filhos

20 Operação de REMOÇÃO - Árvore Binária de Busca
10 10 13 9 5 3 14 24 Caso 1 Nó é folha Caso 2 Nó tem somente 1 filho Caso 3 Nó tem 2 filhos

21 Caso 1: Remoção de Nó Folha
É o caso mais simples de tratar: o ponteiro apropriado do nó pai é ajustado para null e em seguida desalocamos da memória o nó desejado. 34 34 20 40 20 40 36 36 37

22 /* Remove nó folha. */ Arvore* removeFolha(Arvore *a){ if (estaVazia(a->sae) && estaVazia(a->sad)){//é folha? free(a); a = NULL; } return a;

23 Caso 2: Remoção de Nó com 1 Filho
Pai do nó a ser removido é reajustado para apontar para o filho do nó a ser removido. ou seja, o pai vai apontar para o neto (que passa a ser filho). 34 34 20 40 20 40 36 37 37

24 /* Remove nó com apenas um filho. */
Arvore* remove1Filho(Arvore *a){ Arvore *aux; if (estaVazia(a->sae)){ //só tem filho à direita aux = a; a = a->sad; free(aux); }else{ if (estaVazia(a->sad)){ //so tem filho a esquerda a = a->sae; } return a;

25 Caso 3: Remoção de Nó com 2 Filhos
É o caso mais complicado de remoção. Resume-se em substituir o nó a ser removido pelo menor nó à direita, seguido de um ajuste nos ponteiros. 34 34 20 40 20 43 36 56 36 56 35 37 43 67 35 37 67

26 Caso 3: Remoção de Nó com 2 Filhos
A busca pelo menor nó à direita (o substituto do nó a ser removido) : Ir para direita. Procurar elemento mais a esquerda (menor filho à esquerda). Guardar o antecessor para descobrir o pai do substituto. Se a direita do nó a ser removido estiver nula, o substituto será o próximo à esquerda 34 20 40 Pai do Substituto 36 56 35 37 43 67 Substituto

27 Caso 3: Remoção de Nó com 2 Filhos
O ajuste dos ponteiros: Ajustes no campo esq do pai do substituto e no campo dir do substituto (dispensáveis se nó a direita do removido é exatamente o substituto). Campo que referencia nó removido conterá substituto encontrado. Campo esq do substituto aponta para SAE do nó removido. 34 34 20 40 Pai do Substituto 20 43 36 56 36 56 35 37 43 67 35 37 67 Substituto

28 Caso 3: Remoção de Nó com 2 Filhos
Quando o nó a direita do removido é exatamente o substituto. 34 34 20 40 20 56 36 56 36 67 35 37 67 35 37

29 Caso 3: Remoção de Nó com 2 Filhos
Quando o nó a direita do removido é exatamente o substituto. A busca pelo menor nó à direita (o substituto do nó a ser removido) : Ir para direita. Procurar elemento mais a esquerda (menor filho à esquerda). Guardar o antecessor para descobrir o pai do substituto. Se a direita do nó a ser removido estiver nula, o substituto será o próximo à esquerda 34 Pai do Substituto 20 40 Substituto 36 56 35 37 67

30 Caso 3: Remoção de Nó com 2 Filhos
Quando o nó a direita do removido é exatamente o substituto. O ajuste dos ponteiros: Ajustes no campo esq do pai do substituto e no campo dir do substituto (dispensáveis se nó a direita do removido é exatamente o substituto). Campo que referencia nó removido conterá substituto encontrado. Campo esq do substituto aponta para SAE do nó removido. 34 Pai do Substituto 34 20 40 20 56 Substituto 36 56 36 67 35 37 67 35 37

31 Caso 3: Remoção de Nó com 2 Filhos – Exemplo 1
A busca pelo menor nó à direita (o substituto do nó a ser removido) : Ir para direita. Procurar elemento mais a esquerda (menor filho à esquerda). Guardar o antecessor para descobrir o pai do substituto. Se a direita do nó a ser removido estiver nula, o substituto será o próximo à esquerda 70 40 79 36 56 35 37 43 67

32 Caso 3: Remoção de Nó com 2 Filhos – Exemplo 1
O ajuste dos ponteiros: Ajustes no campo esq do pai do substituto e no campo dir do substituto (dispensáveis se nó a direita do removido é exatamente o substituto). Campo que referencia nó removido conterá substituto encontrado. Campo esq do substituto aponta para SAE do nó removido. 70 70 40 79 43 79 36 56 36 56 35 37 43 67 35 37 67

33 Caso 3: Remoção de Nó com 2 Filhos – Exemplo 2
A busca pelo menor nó à direita (o substituto do nó a ser removido) : Ir para direita. Procurar elemento mais a esquerda (menor filho à esquerda). Guardar o antecessor para descobrir o pai do substituto. Se a direita do nó a ser removido estiver nula, o substituto será o próximo à esquerda 70 40 79 36 56 35 37 43 67 45

34 Caso 3: Remoção de Nó com 2 Filhos – Exemplo 2
O ajuste dos ponteiros: Ajustes no campo esq do pai do substituto e no campo dir do substituto (dispensáveis se nó a direita do removido é exatamente o substituto). Campo que referencia nó removido conterá substituto encontrado. Campo esq do substituto aponta para SAE do nó removido. 70 70 40 79 43 79 36 56 36 56 35 37 43 67 35 37 45 67 45

35 Caso 3: Remoção de Nó com 2 Filhos – Exemplo 3
A busca pelo menor nó à direita (o substituto do nó a ser removido) : Ir para direita. Procurar elemento mais a esquerda (menor filho à esquerda). Guardar o antecessor para descobrir o pai do substituto. Se a direita do nó a ser removido estiver nula, o substituto será o próximo à esquerda 70 70 40 79 36 79 35 37 36 35 37

36 /* Remove nó com 2 filhos, 1 filho ou sem filho. */
Arvore* removeNo(Arvore *a, int c){


Carregar ppt "Prof. Hilton Cardoso Marins Junior"

Apresentações semelhantes


Anúncios Google