1 / 34

Árvore Binária de Busca

Á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).

aggie
Download Presentation

Árvore Binária de Busca

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. Á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.

  3. Árvores binárias – árvore binária balanceada: • os nós internos têm todos, ou quase todos, 2 filhos • qualquer nó pode ser alcançado a partir da raiz em O(log n) passos

  4. Á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.

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

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

  7. Ilustrando, ficaria...

  8. Árvore Binária de Busca

  9. Árvores binárias de busca – o valor associado à raiz é sempre maior que o valor associado a qualquer nó da sub-árvore à esquerda (sae) – o valor associado à raiz é sempre menor ou igual (para permitir repetições) que o valor associado a qualquer nó da sub-árvore à direita (sad) – quando a árvore é percorrida em ordem simétrica (sae - raiz - sad), os valores são encontrados em ordem não decrescente

  10. Inserção de Nós

  11. Outra inserção...

  12. Nova Inserção...

  13. E por fim...

  14. Tipo árvore binária – árvore é representada pelo ponteiro para o nó raiz struct arv { int info; struct arv* esq; struct arv* dir; }; typedef struct arv Arv;

  15. Operação de criação: – árvore vazia representada por NULL Arv* abb_cria (void) { return NULL; }

  16. Operação de impressão: – imprime os valores da árvore em ordem crescente, percorrendo os nós em ordem simétrica void abb_imprime (Arv* a) { if (a != NULL) { abb_imprime(a->esq); printf("%d\n",a->info); abb_imprime(a->dir); } }

  17. Pesquisa em árvores binárias de busca – compare o valor dado com o valor associado à raiz – se for igual, o valor foi encontrado – se for menor, a busca continua na sae – se for maior, a busca continua na sad

  18. Operação de busca: – explora a propriedade de ordenação da árvore – possui desempenho computacional proporcional à altura (O(log n) para o caso de árvore balanceada) Arv* abb_busca (Arv* r, int v) { 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->dir, v); else return r; }

  19. Operação de inserção: – recebe um valor v a ser inserido – retorna o eventual novo nó raiz da (sub- árvore) – para adicionar v na posição correta, faça: • se a (sub-)árvore for vazia – crie uma árvore cuja raiz contém v • se a (sub-)árvore não for vazia – compare v com o valor na raiz – insira v na sae ou na sad, conforme o resultado da comparação

  20. Operação de remoção: – recebe um valor v a ser inserido – retorna a eventual nova raiz da árvore – para remover v, faça: • se a árvore for vazia – nada tem que ser feito • se a árvore não for vazia – compare o valor armazenado no nó raiz com v – se for maior que v, retire o elemento da sub-árvore à esquerda – se for menor do que v, retire o elemento da sub-árvore à direita – se for igual a v, retire a raiz da árvore

  21. Operação de remoção (cont.): – para retirar a raiz da árvore, há 3 casos: • caso 1: a raiz que é folha • caso 2: a raiz a ser retirada possui um único filho • caso 3: a raiz a ser retirada tem dois filhos

  22. Exercícios 1.) 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 arvore struct arv { int info; struct arv* esq; struct arv* dir; }; typedef struct arv Arv;

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

  24. int main() { Arv* arvore; arvore = abb_cria(); arvore = abb_insere(arvore,5); arvore = abb_insere(arvore,7); arvore = abb_insere(arvore,2); arvore = abb_insere(arvore,11); arvore = abb_insere(arvore,13); getch(); return 0; } E a impressão??? A Visualização dos dados...???

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

  26. Exercícios Propostos • Exercicio 1 - Gere uma arvore de 20 nós com valores aleatórios de 0 a 100 e mostre a arvore e os endereços na tela

  27. Exercícios Propostos Exercicio 2 - Implemente uma função que retorne a quantidade de folhas de uma árvore binária. Essa função deve obedecer ao protótipo: // int folhas (Arv* a)

  28. Exercícios Propostos Exercicio 3 - Implemente uma função que compare se duas árvores binárias são iguais. Essa função deve obedecer ao protótipo: // Arv* igual (Arv* a, Arv* b)

More Related