• Nenhum resultado encontrado

Árvores Binárias. 26 de outubro de SCC Algoritmos e Estruturas de Dados I

N/A
N/A
Protected

Academic year: 2021

Share "Árvores Binárias. 26 de outubro de SCC Algoritmos e Estruturas de Dados I"

Copied!
46
0
0

Texto

(1)

Árvores Binárias

Árvores Binárias

SCC0202 - Algoritmos e Estruturas de Dados I

Prof. Fernando V. Paulovich

*Baseado no material do Prof. Gustavo Batista. Figuras editadas por Isadora Maria Mendes

http://www.icmc.usp.br/~paulovic paulovic@icmc.usp.br

Instituto de Ciências Matemáticas e de Computação (ICMC) Universidade de São Paulo (USP)

(2)

Árvores Binárias Conceitos Básicos

Sumário

1 Conceitos Básicos

2 Implementação

3 Percurso em Árvore Binária

(3)

Árvores Binárias Conceitos Básicos

Sumário

1 Conceitos Básicos

2 Implementação

3 Percurso em Árvore Binária

(4)

Árvores Binárias Conceitos Básicos

Árvore Binárias

Uma Árvore Binária (AB) T é um conjunto nito de elementos, denominados nós ou vértices, tal que

1 Se T = ∅, a árvore é dita vazia, ou

2 T contém um nó especial r, chamado raiz de T , e os demais nós podem ser subdivididos em dois

sub-conjuntos distintos TE e TD, os quais também são árvores binárias (possivelmente vazias)

TE e TD são denominados sub-árvore esquerda e sub-árvore direita de T , respectivamente

(5)

Árvores Binárias Conceitos Básicos

Árvore Binárias

A raiz da sub-árvore esquerda (direita) de um nó v, se existir, é denominada lho esquerdo (direito) de v

Pela natureza da árvore binária, o lho esquerdo pode existir sem o direito, e vice-versa

(6)

Árvores Binárias Conceitos Básicos

Árvore Estritamente Binária

Uma Árvore Estritamente Binária (ou Árvore Própria) tem nós com ou 0 (nenhum) ou dois lhos

Nós interiores (não folhas) sempre têm 2 lhos

(7)

Árvores Binárias Conceitos Básicos

Árvore Binária Completa

Árvore Binária Completa (ABC)

Se a profundidade da árvore é d, então cada nó folha está no nível d − 1 ou no nível d

O nível d − 1 está totalmente preenchido

Os nós folha no nível d estão todos mais à esquerda possível

(8)

Árvores Binárias Conceitos Básicos

Árvore Binária Completa

Árvore Binária Completa (ABC)

Se a profundidade da árvore é d, então cada nó folha está no nível d − 1 ou no nível d

O nível d − 1 está totalmente preenchido

Os nós folha no nível d estão todos mais à esquerda possível

(9)

Árvores Binárias Conceitos Básicos

Árvore Binária Completa

Árvore Binária Completa (ABC)

Se a profundidade da árvore é d, então cada nó folha está no nível d − 1 ou no nível d

O nível d − 1 está totalmente preenchido

Os nós folha no nível d estão todos mais à esquerda possível

(10)

Árvores Binárias Conceitos Básicos

Árvore Binária Completa Cheia

Árvore Binária Completa Cheia (ABCC)

É uma Árvore Estritamente Binária

(11)

Árvores Binárias Conceitos Básicos

Árvore Binária Completa Cheia

Árvore Binária Completa Cheia (ABCC)

É uma Árvore Estritamente Binária

(12)

Árvores Binárias Conceitos Básicos

Árvore Binária Completa Cheia

Dada uma ABCC e sua profundidade d, pode-se calcular o número total de nós na árvore

d = 0: 1 nó (total 1 nó)

d = 1 :2 nós (total 3 nós) d = 2 :4 nós (total 7 nós) ...

(13)

Árvores Binárias Conceitos Básicos

Árvore Binária Completa Cheia

Dada uma ABCC e sua profundidade d, pode-se calcular o número total de nós na árvore

d = 0: 1 nó (total 1 nó) d = 1 :2 nós (total 3 nós)

d = 2 :4 nós (total 7 nós) ...

(14)

Árvores Binárias Conceitos Básicos

Árvore Binária Completa Cheia

Dada uma ABCC e sua profundidade d, pode-se calcular o número total de nós na árvore

d = 0: 1 nó (total 1 nó) d = 1 :2 nós (total 3 nós) d = 2 :4 nós (total 7 nós)

...

(15)

Árvores Binárias Conceitos Básicos

Árvore Binária Completa Cheia

Dada uma ABCC e sua profundidade d, pode-se calcular o número total de nós na árvore

d = 0: 1 nó (total 1 nó) d = 1 :2 nós (total 3 nós) d = 2 :4 nós (total 7 nós) ...

(16)

Árvores Binárias Conceitos Básicos

Árvore Binária Completa Cheia

Dada uma ABCC e sua profundidade d, pode-se calcular o número total de nós na árvore

d = 0: 1 nó (total 1 nó) d = 1 :2 nós (total 3 nós) d = 2 :4 nós (total 7 nós) ...

(17)

Árvores Binárias Conceitos Básicos

Árvore Binária Completa Cheia

Portanto, o número de nós, n, para uma árvore binária completa cheia de profundidade d é

n = 2d+1− 1

Então n nós podem ser distribuídos em uma árvore binária completa cheia de profundidade

n = 2d+1− 1

log2(n + 1) = log2(2d+1) d = log2(n + 1) − 1

(18)

Árvores Binárias Conceitos Básicos

Árvore Binária Balanceada

Árvore Binária Balanceada (ABB)

Para cada nó, as alturas de suas duas sub-árvores diferem de, no máximo, 1

(19)

Árvores Binárias Conceitos Básicos

Árvore Binária Perfeitamente Balanceada

Árvore Binária Perfeitamente Balanceada

Para cada nó, o número de nós de suas sub-árvores esquerda e direita difere em, no máximo, 1

Toda Árvore Binária Perfeitamente Balanceada é

(20)

Árvores Binárias Conceitos Básicos

Árvore Binária Perfeitamente Balanceada

Árvore Binária Perfeitamente Balanceada

Para cada nó, o número de nós de suas sub-árvores esquerda e direita difere em, no máximo, 1

Toda Árvore Binária Perfeitamente Balanceada é

(21)

Árvores Binárias Conceitos Básicos

Questões

Qual a altura máxima de uma AB com n nós?

Resposta: n − 1

(22)

Árvores Binárias Conceitos Básicos

Questões

Qual a altura máxima de uma AB com n nós?

Resposta: n − 1

(23)

Árvores Binárias Conceitos Básicos

Questões

Qual a altura máxima de uma AB com n nós?

Resposta: n − 1

(24)

Árvores Binárias Conceitos Básicos

Questões

Qual a altura mínima de uma AB com n nós?

Resposta: a mesma de uma AB Perfeitamente Balanceada com n nós

(25)

Árvores Binárias Conceitos Básicos

Questões

Qual a altura mínima de uma AB com n nós?

Resposta: a mesma de uma AB Perfeitamente Balanceada com n nós

(26)

Árvores Binárias Conceitos Básicos

Questões

Qual a altura mínima de uma AB com n nós?

Resposta: a mesma de uma AB Perfeitamente Balanceada com n nós

(27)

Árvores Binárias Implementação

Sumário

1 Conceitos Básicos

2 Implementação

3 Percurso em Árvore Binária

(28)

Árvores Binárias Implementação

Implementação de ABC (alocação estática,

seqüencial)

(29)

Árvores Binárias Implementação

Implementação de ABC (alocação estática,

seqüencial)

Para um vetor indexado a partir da posição 0, se um nó está na posição i, seus lhos diretos estão nas posições

2i + 1: lho da esquerda 2i + 2: lho da direita

Vantagem: espaço só p/ armazenar conteúdo; ligações implícitas

Desvantagem: espaços vagos se árvore não é completa por níveis, ou se sofrer eliminação

(30)

Árvores Binárias Implementação

Implementação de AB (dinâmica)

Para qualquer árvore, cada nó é do tipo

1 typedef struct arvore_binaria

←-ARVORE_BINARIA;

2 typedef struct no NO; 3 4 struct no { 5 ITEM *item; 6 NO *filhoesq; 7 NO *filhodir; 8 }; 9 10 struct arvore_binaria { 11 NO *raiz; 12 };

(31)

Árvores Binárias Implementação

Operações do TAD AB I

Criar árvore

Pré-condição: nenhuma

Pós-condição: inicia a estrutura de dados Criar raiz

Pré-condição: nenhuma

Pós-condição: cria o nó raiz da árvore e armazena um valor. Retorna true se conseguiu criar, false caso contrário

(32)

Árvores Binárias Implementação

Operações do TAD AB II

Inserir o nó a direita de um nó Pré-condição: nó não nulo.

Pós-condição: dado um nó, cria seu lho a direita e armazena um valor. Retorna esse lho, se o mesmo pode ser criado, NULL caso contrário

Inserir o nó a esquerda de um nó Pré-condição: nó não nulo

Pós-condição: dado um nó, cria seu lho a esquerda e armazena um valor. Retorna esse lho, se o mesmo pode ser criado, NULL caso contrário

(33)

Árvores Binárias Implementação

Operações do TAD AB

1 ARVORE_BINARIA *criar_arvore() {

2 ARVORE_BINARIA *arv = (ARVORE_BINARIA *)malloc(sizeof

(ARVORE_BINARIA←-)); 3 if (arv != NULL) { 4 arv->raiz = NULL; 5 } 6 return arv; 7 } 8

9 NO *criar_raiz(ARVORE_BINARIA *arvore, ITEM *item) {

10 arvore->raiz = (NO *) malloc(sizeof (NO)); 11 if (arvore->raiz != NULL) { 12 arvore->raiz->filhodir = NULL; 13 arvore->raiz->filhoesq = NULL; 14 arvore->raiz->item = item; 15 } 16 return arvore->raiz; 17 }

(34)

Árvores Binárias Implementação

Operações do TAD AB

1 #define FILHO_ESQ 0 2 #define FILHO_DIR 1 3

4 NO *inserir_filho(int filho, NO *no, ITEM *item) { 5 NO *pnovo = (NO *) malloc(sizeof (NO));

6 7 if (pnovo != NULL) { 8 pnovo->filhodir = NULL; 9 pnovo->filhoesq = NULL; 10 pnovo->item = item; 11 12 if (filho == FILHO_ESQ) { 13 no->filhoesq = pnovo; 14 } else { 15 no->filhodir = pnovo; 16 } 17 } 18 19 return pnovo; 20 }

(35)

Árvores Binárias

Percurso em Árvore Binária

Sumário

1 Conceitos Básicos

2 Implementação

3 Percurso em Árvore Binária

(36)

Árvores Binárias

Percurso em Árvore Binária

AB - Percursos

Percorrer uma AB visitando cada nó uma única vez

Visitar um nó pode ser

Mostrar o seu valor Modicar o valor do nó ...

Um percurso gera uma sequência linear de nós, e

podemos então falar de nó predecessor ou sucessor de um nó, segundo um dado percurso

Não existe um percurso único para árvores (binárias ou não): diferentes percursos podem ser realizados, dependendo da aplicação

(37)

Árvores Binárias

Percurso em Árvore Binária

AB - Percursos em Árvores

3 percursos básicos para AB's:

pré-ordem (Pre-order)

visita a raiz

percorre a subárvore a esquerda em pré-ordem percorre a subárvore a direita em pré-ordem

em-ordem (In-order)

percorre e subárvore a esquerda em em-ordem visita a raiz

percorre a subárvore a direita em em-ordem

pós-ordem (Post-order)

percorre e subárvore a esquerda em pós-ordem percorre a subárvore a direita em pós-ordem visita a raiz

A diferença entre eles está, basicamente, na ordem em que os nós são visitados

(38)

Árvores Binárias

Percurso em Árvore Binária

AB - Percurso Pré-Ordem

1 void preordem_aux(NO *raiz) { 2 if (raiz != NULL) { 3 imprimir_item(raiz->item); 4 preordem_aux(raiz->filhoesq); 5 preordem_aux(raiz->filhodir); 6 } 7 } 8

9 void preordem(ARVORE_BINARIA *arvore) { 10 preordem_aux(arvore->raiz);

11 }

(39)

Árvores Binárias

Percurso em Árvore Binária

AB - Percurso Em-Ordem

1 void emordem_aux(NO *raiz) { 2 if (raiz != NULL) { 3 emordem_aux(raiz->filhoesq); 4 imprimir_item(raiz->item); 5 emordem_aux(raiz->filhodir); 6 } 7 } 8

9 void emordem(ARVORE_BINARIA *arvore) { 10 emordem_aux(arvore->raiz);

11 }

(40)

Árvores Binárias

Percurso em Árvore Binária

AB - Percurso Pós-Ordem

1 void posordem_aux(NO *raiz) { 2 if (raiz != NULL) { 3 posordem_aux(raiz->filhoesq); 4 posordem_aux(raiz->filhodir); 5 imprimir_item(raiz->item); 6 } 7 } 8

9 void emordem(ARVORE_BINARIA *arvore) { 10 posordem_aux(arvore->raiz);

11 }

(41)

Árvores Binárias

Percurso em Árvore Binária

AB - Percursos

Percurso para expressões aritméticas

Pré-ordem: +a*bc Em-ordem: a+(b*c) Pós-ordem: abc*+

(42)

Árvores Binárias

Percurso em Árvore Binária

Exercícios

Uma árvore binária completa cheia é uma árvore binária completa?

Uma árvore estritamente binária é uma árvore binária completa?

Escreva um procedimento recursivo que calcula a altura de uma AB

Escreva um procedimento recursivo que apaga uma árvore (executa free() em todos os nós)

(43)

Árvores Binárias

Outras Operações sobre Árvores Binárias

Sumário

1 Conceitos Básicos

2 Implementação

3 Percurso em Árvore Binária

(44)

Árvores Binárias

Outras Operações sobre Árvores Binárias

Procedimento recursivo p/ destruir árvore,

liberando o espaço alocado

1 void apagar_arvore_aux(NO *raiz) { 2 if (raiz != NULL) { 3 apagar_arvore_aux(raiz->filhoesq); 4 apagar_arvore_aux(raiz->filhodir); 5 apagar_item(&(raiz->item)); 6 free(raiz); 7 } 8 } 9

10 void apagar_arvore(ARVORE_BINARIA **arvore) { 11 apagar_arvore_aux((*arvore)->raiz);

12 free(*arvore); 13 *arvore = NULL; 14 }

(45)

Árvores Binárias

Outras Operações sobre Árvores Binárias

Função recursiva para calcular altura de uma

árvore

1 int altura_arvore_aux(NO *no) { 2 if (no == NULL) return -1;

3 int esq = altura_arvore_aux(no->filhoesq); 4 int dir = altura_arvore_aux(no->filhodir); 5 return ((esq > dir) ? esq : dir) + 1; 6 }

7

8 int altura_arvore(ARVORE_BINARIA *arvore) { 9 return altura_arvore_aux(arvore->raiz);

(46)

Árvores Binárias

Outras Operações sobre Árvores Binárias

Exercícios

Considerando uma árvore que armazene inteiros

Implemente um método que retorne a quantidade de elementos em uma árvore

Implemente um método que retorne o maior elemento de uma árvore

Implemente um método que retorne o menor elemento de uma árvore

Implemente um método que retorne a soma de todos elementos de uma árvore

Referências

Documentos relacionados

Apesar de o mercado acionário brasileiro ter se tornado mais importante para a economia brasileira, sobretudo entre o período de 2002 para 2005 (Tabela 3), sua repre- sentatividade

Puxe a alça lateral segurando pela fivela que você alcançou trazendo-a para baixo e cruzando suas costas até encontrar a outra parte da fivela que está no painel.. Feche a fivela

Assim como a Natureza, a leitura de folhetos de cordel constituiu uma fonte de inspiração para fazer poesia.. Na comunidade em que vivia Patativa, a leitura dos folhetos de

As quinolonas já têm sido relatadas como seguras para o tratamento da otite, sem apresentar sinais de ototoxicidade nos animais (GOTTHELF, 2004), e não foram observados

Observações como esta ganham peso ainda maior quando se leva em conta que, num país desprovido de cultura científica, os veículos de comunicação representam o canal mais

É relevante, ainda, considerar que os termos “reciclagem/ formação” indiciam a vontade que o especialista, reconhecido como portador de um saber, tem de

A porta de alta SEGURANÇA, de DUPLO BATENTE da PORTRISA, permite ocupar vãos mais amplos com o mesmo nível de segurança de qualquer porta START ou MAX, a folha passiva inclui

Professores do 3º Ciclo e do Ensino Secundário da Esc.. Ação e formador Área Destinatários Modalidade e nº horas Calendarização. APRENDIZAGEM ATIVA COM RECURSO ÀS TIC