Árvore Binária de Busca

34
Árvore Binária de Árvore Binária de Busca Busca Estrutura de Dados II Estrutura de Dados II Prof. Gale Prof. Gale

description

Árvore Binária de Busca. Estrutura de Dados II Prof. Gale. Árvores Conceitos. Existem alguns conceitos que são comuns a todos os tipos de árvores. Eis alguns desses conceitos que devemos conhecer: Nó : item de informação com ramos para outros nós (descendentes). - PowerPoint PPT Presentation

Transcript of Árvore Binária de Busca

Page 1: Árvore Binária de Busca

Árvore Binária de Árvore Binária de BuscaBusca

Estrutura de Dados IIEstrutura de Dados II

Prof. GaleProf. Gale

Page 2: Árvore Binária de Busca

Árvores ConceitosÁrvores Conceitos

Existem alguns conceitos que são comuns a todos os tipos de árvores. Eis alguns desses conceitos que devemos conhecer:

Nó: item de informação com ramos para outros nós (descendentes).

Grau: número de sub-árvores de um nó. Folhas: nós terminais (grau = 0). Filhos de um nó: raízes das sub-árvores desse nó. Pai: ancestral direto de um nó. Grau de uma árvore: grau máximo dos nós da árvore. Ancestral de um nó: todos os nós a partir da raiz até o pai do

nó. Descendentes de um nó: todos os nós nas sub-árvores de

um nó. Nível de um nó:Raiz tem nível 1. Nó no nível i, seus filhos

estão no nível i+1 Altura/profundidade de uma árvore: nível maior

considerando qualquer nó da árvore.

Page 3: Árvore Binária de Busca

Árvores bináriasÁrvores binárias

– – árvore binária balanceada:árvore binária balanceada:

• • os nós internos têm todos, os nós internos têm todos, ou quase todos, 2 filhosou quase todos, 2 filhos

• • qualquer nó pode ser qualquer nó pode ser alcançado a partir da raiz em alcançado a partir da raiz em O(log n) O(log n) passospassos

Page 4: Árvore Binária de Busca

Árvore BináriaÁrvore Binária É um conjunto finito de nós que pode ser vazio ou

consistir de uma raiz e duas árvores binárias disjuntas chamadas sub-árvore esquerda e direita.

Page 5: Árvore Binária de Busca

Fazendo Relação...Fazendo Relação...“Nó Lista Ligada” X“Nó Lista Ligada” X

Page 6: Árvore Binária de Busca

X “Nó de uma Árvore Binária”X “Nó de uma Árvore Binária”

Page 7: Árvore Binária de Busca

Ilustrando, ficaria...Ilustrando, ficaria...

Page 8: Árvore Binária de Busca

Árvore Binária de BuscaÁrvore Binária de Busca

Page 9: Árvore Binária de Busca

Árvores binárias de buscaÁrvores binárias de busca

– – o valor associado à raiz é sempre maior que o valor o valor associado à raiz é sempre maior que o valor associado a qualquer nó da sub-árvore à esquerda (associado a qualquer nó da sub-árvore à esquerda (saesae) )

– – o valor associado à raiz é sempre menor ou igual (para o valor associado à raiz é sempre menor ou igual (para permitir repetições) que o valor associado a qualquer nó permitir repetições) que o valor associado a qualquer nó da sub-árvore à direita (da sub-árvore à direita (sadsad))

– – quando a árvore é percorrida em ordem simétrica (quando a árvore é percorrida em ordem simétrica (sae - sae - raiz - sadraiz - sad), os valores são encontrados em ordem não ), os valores são encontrados em ordem não decrescentedecrescente

Page 10: Árvore Binária de Busca

Inserção de NósInserção de Nós

Page 11: Árvore Binária de Busca

Outra inserção...Outra inserção...

Page 12: Árvore Binária de Busca

Nova Inserção...Nova Inserção...

Page 13: Árvore Binária de Busca

E por fim...E por fim...

Page 14: Árvore Binária de Busca

Tipo árvore bináriaTipo árvore binária– – árvore é representada pelo ponteiro árvore é representada pelo ponteiro

para o nó raizpara o nó raizstruct arv struct arv {{

int info;int info;struct arv* esq;struct arv* esq;struct arv* dir;struct arv* dir;

};};typedef struct arv Arv;typedef struct arv Arv;

Page 15: Árvore Binária de Busca

Operação de criação:Operação de criação:

– – árvore vazia representada por NULLárvore vazia representada por NULL

Arv* abb_cria (void)Arv* abb_cria (void)

{{

return NULL;return NULL;

}}

Page 16: Árvore Binária de Busca

Operação de impressão:Operação de impressão:– – imprime os valores da árvore em ordem imprime os valores da árvore em ordem

crescente, percorrendo os nós em ordem crescente, percorrendo os nós em ordem simétricasimétrica

void abb_imprime (Arv* a)void abb_imprime (Arv* a){{ if (a != NULL) if (a != NULL) {{ abb_imprime(a->esq);abb_imprime(a->esq); printf("%d\n",a->info);printf("%d\n",a->info); abb_imprime(a->dir);abb_imprime(a->dir); }}}}

Page 17: Árvore Binária de Busca

Pesquisa em árvores binárias de Pesquisa em árvores binárias de buscabusca

– – compare o valor dado com o valor compare o valor dado com o valor associado à raizassociado à raiz

– – se for igual, o valor foi encontradose for igual, o valor foi encontrado

– – se for menor, a busca continua na se for menor, a busca continua na saesae

– – se for maior, a busca continua na se for maior, a busca continua na sadsad

Page 18: Árvore Binária de Busca

Operação de busca:Operação de busca:– – explora a propriedade de ordenação da árvoreexplora a propriedade de ordenação da árvore

– – possui desempenho computacional proporcional à possui desempenho computacional proporcional à altura (O(log n) para o caso de árvore altura (O(log n) para o caso de árvore balanceada)balanceada)

Arv* abb_busca (Arv* r, int v)Arv* abb_busca (Arv* r, int v)

{{

if (r == NULL) return NULL;if (r == NULL) return NULL;

else if (r->info > v) return abb_busca (r->esq, v);else if (r->info > v) return abb_busca (r->esq, v);

else if (r->info < v) return abb_busca (r->dir, v);else if (r->info < v) return abb_busca (r->dir, v);

else return r;else return r;

}}

Page 19: Árvore Binária de Busca

Operação de inserção: Operação de inserção: – – recebe um valor v a ser inseridorecebe um valor v a ser inserido– – retorna o eventual novo nó raiz da (sub- árvore)retorna o eventual novo nó raiz da (sub- árvore)– – para adicionar v na posição correta, faça:para adicionar v na posição correta, faça:

se a (sub-)árvore for vaziase a (sub-)árvore for vazia– – crie uma árvore cuja raiz contém vcrie uma árvore cuja raiz contém v

• • se a (sub-)árvore não for vaziase a (sub-)árvore não for vazia– – compare v com o valor na raizcompare v com o valor na raiz– – insira v na sae ou na sad, conforme o resultado insira v na sae ou na sad, conforme o resultado da comparaçãoda comparação

Page 20: Árvore Binária de Busca
Page 21: Árvore Binária de Busca

Operação de remoção:Operação de remoção:– – recebe um valor v a ser inseridorecebe um valor v a ser inserido– – retorna a eventual nova raiz da árvoreretorna a eventual nova raiz da árvore– – para remover v, faça:para remover v, faça:

• • se a árvore for vaziase a árvore for vazia– – nada tem que ser feitonada tem que ser feito

• • se a árvore não for vaziase a árvore não for vazia– – compare o valor armazenado no nó raiz com vcompare o valor armazenado no nó raiz com v– – se for maior que v, retire o elemento da sub-se for maior que v, retire o elemento da sub-árvore à esquerdaárvore à esquerda– – se for menor do que v, retire o elemento da sub-se for menor do que v, retire o elemento da sub-árvore à direitaárvore à direita– – se for igual a v, retire a raiz da árvorese for igual a v, retire a raiz da árvore

Page 22: Árvore Binária de Busca

Operação de remoção (cont.):Operação de remoção (cont.):

– – para retirar a raiz da árvore, há 3 para retirar a raiz da árvore, há 3 casos:casos:

• • caso 1: a raiz que é folhacaso 1: a raiz que é folha

• • caso 2: a raiz a ser retirada possui caso 2: a raiz a ser retirada possui um único filhoum único filho

• • caso 3: a raiz a ser retirada tem dois caso 3: a raiz a ser retirada tem dois filhosfilhos

Page 23: Árvore Binária de Busca
Page 24: Árvore Binária de Busca
Page 25: Árvore Binária de Busca
Page 26: Árvore Binária de Busca
Page 27: Árvore Binária de Busca
Page 28: Árvore Binária de Busca

ExercíciosExercícios1.) Desenvolva um programa em “C” que crie uma árvore e insira dados nesta árvore.

#include <stdio.h>#include <conio.h>#include <stdlib.h>// definindo a estrutura da arvorestruct arv { int info; struct arv* esq; struct arv* dir;};

typedef struct arv Arv;

Page 29: Árvore Binária de Busca

// Criação da árvore// Criação da árvoreArv* abb_cria (void)Arv* abb_cria (void){{ return NULL;return NULL;}}

// Inserção de um nó// Inserção de um nóArv* abb_insere (Arv* a, int v)Arv* abb_insere (Arv* a, int v){{ if (a==NULL) if (a==NULL) {{ a = (Arv*)malloc(sizeof(Arv));a = (Arv*)malloc(sizeof(Arv)); a->info = v;a->info = v; a->esq = a->dir = NULL;a->esq = a->dir = NULL; }} else else if (v < a->info)if (v < a->info) a->esq = abb_insere(a->esq,v);a->esq = abb_insere(a->esq,v); else /* v > a->info */else /* v > a->info */ a->dir = abb_insere(a->dir,v);a->dir = abb_insere(a->dir,v); return a;return a;}}

Page 30: Árvore Binária de Busca

int main()int main(){{ Arv* arvore;Arv* arvore; arvore = abb_cria();arvore = abb_cria(); arvore = abb_insere(arvore,5);arvore = abb_insere(arvore,5); arvore = abb_insere(arvore,7);arvore = abb_insere(arvore,7); arvore = abb_insere(arvore,2);arvore = abb_insere(arvore,2); arvore = abb_insere(arvore,11);arvore = abb_insere(arvore,11); arvore = abb_insere(arvore,13);arvore = abb_insere(arvore,13);

getch();getch(); return 0;return 0;}}

E a impressão??? A Visualização dos dados...???

Page 31: Árvore Binária de Busca

Função de ImpressãoFunção de Impressão

// impressão dos dados da árvore// impressão dos dados da árvorevoid abb_imprime (Arv* a)void abb_imprime (Arv* a){{ if (a != NULL) if (a != NULL) {{ abb_imprime(a->esq);abb_imprime(a->esq); printf("%d\n",a->info);printf("%d\n",a->info); abb_imprime(a->dir);abb_imprime(a->dir); }}}}

Page 32: Árvore Binária de Busca

Exercícios PropostosExercícios Propostos

Exercicio 1 - Gere uma arvore de 20 Exercicio 1 - Gere uma arvore de 20 nós com valores aleatórios de 0 a nós com valores aleatórios de 0 a 100 e mostre a arvore e os 100 e mostre a arvore e os endereços na telaendereços na tela

Page 33: Árvore Binária de Busca

Exercícios PropostosExercícios Propostos

Exercicio 2 - Implemente uma função Exercicio 2 - Implemente uma função que retorne a quantidade de folhas que retorne a quantidade de folhas de uma árvore binária. Essa função de uma árvore binária. Essa função deve obedecer ao protótipo:deve obedecer ao protótipo:

// int folhas (Arv* a)// int folhas (Arv* a)

Page 34: Árvore Binária de Busca

Exercícios PropostosExercícios Propostos

Exercicio 3 - Implemente uma função Exercicio 3 - Implemente uma função que compare se duas árvores que compare se duas árvores binárias são iguais. Essa função deve binárias são iguais. Essa função deve obedecer ao protótipo:obedecer ao protótipo:

// Arv* igual (Arv* a, Arv* b)// Arv* igual (Arv* a, Arv* b)