Árvores Binárias. 9/11 e 11/11 Conceitos Representação e Implementação

Documentos relacionados
Árvores Binárias. 16/11 Representação e Implementação: Encadeada Dinâmica O TAD

Árvores Binárias. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich

Árvores & Árvores Binárias

Fontes Bibliográficas. Estruturas de Dados Aula 15: Árvores. Livros:

Árvores. SCC-202 Algoritmos e Estruturas de Dados I. Lucas Antiqueira

SUMÁRIO. Fundamentos Árvores Binárias Árvores Binárias de Busca

Árvores Binárias de Busca (ABB) 18/11

Árvores Binárias de Busca (ABB) 18/11

Aula 08. Estruturas de dados Árvore e Grafo

Algoritmos e Estrutura de Dados II. Árvore. Prof a Karina Oliveira.

ÁRVORES E ÁRVORE BINÁRIA DE BUSCA

Estruturas de Dados. Módulo 17 - Busca. 2/6/2005 (c) Dept. Informática - PUC-Rio 1

INF 1010 Estruturas de Dados Avançadas. Árvores binárias

Programação II. Árvores Binárias (Binary Trees) Bruno Feijó Dept. de Informática, PUC-Rio

ESTRUTURA DE DADOS. Árvores, árvores binárias e percursos. Cristina Boeres

DAINF - Departamento de Informática

Árvores Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação

Árvores binárias de busca

ÁRVORES E ÁRVORES BINÁRIAS. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

ÁRVORE BINÁRIA DE BUSCA

Árvores. Prof. César Melo DCC/ICE/UFAM

Árvores. SCC-214 Projeto de Algoritmos. Thiago A. S. Pardo. Um nó após o outro, adjacentes Sem relações hierárquicas entre os nós, em geral

Árvores Binária de Busca. Prof. César Melo DCC/ICE/UFAM

UFJF - DCC - Estrutura de Dados e Laboratório de Programação II

Introdução a AVL: teoria e prática. 22/11, 25/11 e 30/11

Árvores binárias de busca

Heaps. Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação 1 / 35

Árvore Binária de Busca. Prof. César Melo

ÁRVORES BINÁRIAS DE BUSCA. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Árvores. Prof. César Melo DCC/ICE/UFAM

Estrutura de Dados. Carlos Eduardo Batista. Centro de Informática - UFPB

ESTRUTURA DE DADOS DCC013. Árvore Binária de Busca

Pilhas e Filas Encadeadas. Algoritmos e Estruturas de Dados I

Métodos Computacionais. Árvores

Edital de Seleção 024/2017 PROPESP/UFAM. Prova de Conhecimento. Caderno de Questões

Árvores Binárias de Busca

Estrutura de Dados: Lista Linear. Parte I Introdução e Listas Sequenciais Estáticas

Árvores. N-árias, Binárias, Busca. Vanessa Maia Berny Mestrado em Ciência da Computação

Listas Estáticas. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof.

Árvores Binárias de Busca

INF 1620 P2-01/11/03 Questão 1 Nome:

Árvores Binárias de Busca

Conceitos gerais Terminologia Forma de Representação de Árvores Árvores Binárias

Árvores. Prof. César Melo ICOMP/UFAM

Árvore Binária Exemplo de Implementação

Aula T13 BCC202 Árvores. Túlio Toffolo

Árvores AVL e Árvores B. Jeane Melo

Estruturas de Dados Aula 16: Árvores com Número Variável 13/06/2011

Árvores. Algoritmos e Estruturas de Dados I. José Augusto Baranauskas Departamento de Física e Matemática FFCLRP-USP

INF1010 Lista de Exercícios 2

Listas - Outras. Listas Circulares Nós Cabeça Listas Duplamente Ligadas/Encadeadas Aplicações

ADT - Árvores. ADT Árvores Definição

Edital de Seleção 053/2016 PROPESP/UFAM. Prova de Conhecimento. Caderno de Questões

Árvores. ! utilizada em muitas aplicações. ! modela uma hierarquia entre elementos. ! O conceito de árvores está diretamente ligado à recursão

AED1 - Árvores. Hebert Coelho. Instituto de Informática Universidade Federal de Goiás. HC AED1-Árvores 1/49

1. Proponha algoritmos para: a. Calcular a altura dos nós de uma árvore binária dada, armazenando o valor da altura no nó.

Árvores de Pesquisa (Parte I)

Árvores Binárias Balanceadas Estrutura de Dados I

1. Proponha algoritmos para: a. Calcular a altura dos nós de uma árvore binária dada, armazenando o valor da altura no nó.

Estruturas de Dados II

ESTRUTURA DE DADOS E ALGORITMOS HEAPS E LISTAS DE PRIORIDADES

INF PROGRAMAÇÃO II LISTA DE EXERCÍCIOS 15

UNIVERSIDADE DE SÃO PAULO ICMC SCC 202 Algoritmos e Estrutura de Dados I - 2º Semestre 2010 Profa. Sandra Maria Aluísio;

Listas Lineares. continuando...

Transcrição:

Árvores Binárias 9/11 e 11/11 Conceitos Representação e Implementação

Árvore Binárias (AB) Uma Árvore Binária (AB) T é um conjunto finito de elementos, denominados nós ou vértices, tal que: (i) Se T =, a árvore é dita vazia, ou (ii) T contém um nó especial, chamado raiz de T, e os demais nós podem ser subdivididos em dois sub-conjuntos distintos T E e T D, os quais também são árvores binárias. T E e T D são denominados sub-árvore esquerda e subárvore direita de T, respectivamente

Árvore Binárias (AB) (cont.) A raiz da sub-árvore esquerda (direita) de um nó v, se existir, é denominada filho esquerdo (direito) de v. Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa Se r é a raiz de T, diz-se que T Er e T Dr são as subárvores esquerda e direita de T, respectivamente Árvore Binária é uma árvore ordenada de grau 2.

Exemplos de Árvore Binárias (AB) A B C D E F G H I

Exemplos de Árvores Binárias

Eficiência para as operações Árvores binárias podem ser usadas para guardar e recuperar informações, com número de operações proporcional à altura da árvore, ou seja, variando, aproximadamente, entre log 2 n e n (quando se torna degenerada para uma lista). Mais tarde veremos como esta manipulação pode ser realizada de maneira a garantir a altura da ordem de O(log 2 n)

Tipos de AB Árvore Estritamente Binária Árvore Binária Completa Há duas definições: (i) completa = cheia e (ii) completa = a definição de quase completa, dada abaixo Árvore Binária Quase Completa Árvore Binária Balanceada (altura difere max 1) Árvore Binária Perfeitamente Balanceada (número de nós difere max 1)

Árvore Estritamente Binária Uma Árvore Estritamente Binária tem nós que têm ou 0 (nenhum) ou dois filhos Nós internos (não folhas) sempre têm 2 filhos C B A D G E F

Árvore Binária Completa (Cheia) Árvore Binária Completa (Cheia) (ABC) é estritamente binária, de nível d; e todos os seus nós-folha estão no mesmo nível (d) A C,D,E,F estão no nível 3 (altura = 3) B G C D E F

Árvore Binária Completa (Cheia) Dada uma ABC e sua altura, pode-se calcular o número total de nós na árvore p.ex., uma ABC com altura 3 tem 7 nós Nível 1: => 1 nó Nível 2: => 2 nós Nível 3: => 4 nós No. Total de nós = 1 + 2 + 4 = 7 Verifique que: se uma ABC tem altura h, então o número de nós da árvore é dado por: N = 2 h - 1

Nível 1 Número de nós por nível 1 = 2 0 2 2 = 2 1 3 4 = 2 2... h... h-1 N = 2 i = 2 h - 1 i=0 2 h-1

Árvore Completa (Cheia) de grau d e altura h Nível 1 Número de nós por nível 1 2 d 3... d 2... h... h-1 N(h) = d i = d h - 1 i=0 d - 1, d > 1 d h-1

Inversamente: Se N é o número de nós de uma ABC, de grau d, qual é a altura h da árvore? N(h) = d h - 1 d - 1 h = log d (N.d N + 1) para d=2: h = log 2 (N + 1) 13/40

Árvore Binária Quase Completa Árvore Binária Quase Completa Se a altura da árvore é d, cada nó folha está no nível d ou no nível d-1. Em outras palavras, a diferença de altura entre as sub-árvores de qualquer nó é no máximo 1. 14/40

Implicações dos conceitos completa (cheia) e quase completa Importante para: sua alocação em vetores, pois quando é cheia não desperdiça espaço, e na definição do método de ordenação heapsort que trabalha com o conceito de árvore completa como se fosse nossa definição de quase completa. Neste método a árvore (heap) é preenchida da esquerda para direita. Uma árvore completa é aquela em que se n é um nó com algumas de subárvores vazias, então n se localiza no penúltimo ou no último nível. 15/40

Árvore Binária Balanceada Árvore Binária Balanceada para cada nó, as alturas de suas duas subárvores diferem de, no máximo, 1 A A B C B C D E D E F 16/40

Á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 AB Perfeitamente Balanceada é Balanceada, mas o inverso não é necessariamente verdade. Uma AB com N nós tem altura mínima se e só se for Perfeitamente Balanceada. 17/40

Exemplo A A B C B C D E D E F Árvore Balanceada Árvore Perfeitamente Balanceada 6 nós: h min = 3 18/40

Árvores Perfeitamente Balanceadas de Grau 2 19/40

Questões Qual a altura máxima de uma AB com n nós? Resposta: n Árvore degenerada Lista n 2 1 Há outra forma para esta árvore? 20/40

Questões Qual a altura mínima de uma AB c/ n nós? Resposta: a mesma de uma AB Perfeitamente Balanceada com N nós 8 4 1 2 3 5 6 7 N=1; h=1 N=2,3; h=2 N=4..7; h=3 N=8..15; h=4 h min = log 2 N+1 (maior inteiro log 2 N) + 1 ou h min = log 2 (N+1) menor inteiro log 2 (N+1) 21/40

Árvores de Altura Mínima 22/40

Questões Uma árvore binária completa é uma árvore estritamente binária? Uma árvore estritamente binária é uma árvore binária completa? 23/40

Implicações dos conceitos de balanceada e perfeitamente balanceada Estas árvores permitem que a recuperação de informação possa ser realizada de maneira a garantir a altura da ordem de O(log 2 n) e assim a eficiência em termos de tempo. 24/40

Representação/Implementação Estática Seqüêncial Simples, Melhor solução quando é completa (cheia). Se não for completa (cheia), um campo usado é necessário para indicar qual posição tem ou não elemento. Encadeada Dinâmica O limite para o número de nós é a memória Preferida no caso geral 25/40

Árvores binárias Representação estática e seqüencial de árvores binárias Vetor 0 6 Como colocar a árvore abaixo nesse vetor?

Árvores binárias Representação estática e seqüencial de árvores binárias Vetor 0 6 C B A Como colocar a árvore abaixo nesse vetor?

Árvores binárias Representação estática e seqüencial de árvores binárias Vetor 0 6 C B A G D Como colocar a árvore abaixo nesse vetor?

Árvores binárias Representação estática e seqüencial de árvores binárias Vetor 0 6 C B A G D F E Como colocar a árvore abaixo nesse vetor?

Árvores binárias Representação estática e seqüencial de árvores binárias 0 6 C B A G D F E Como saber quem é filho de quem?

Árvores binárias Representação estática e seqüencial de árvores binárias 0 6 C B A G D F E Como saber quem é filho de quem? Filhos de i são 2i+1 e 2i+2

AB Completa (Cheia) (estática, seqüencial) 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 32/40

ED AB, seqüencial estática #define NUMNODES 500 typedef int elem; struct arv { elem info; int used; } typedef struct arv Arv[NUMNODES]; 33/40

Criar uma árvore com nó raiz void criar(elem x, Arv t[ ]) { Int p; t[0].info = x; t[0].used = 1; For (p=1; p<numnodes;p++) t[p].used = 0; } // para criar a árvore vazia é só setar FALSE no campo used de 0.. NUMNODES 34/40

ED AB, encadeada dinâmica Para qualquer árvore, cada nó é do tipo info esq dir typedef int elem; typedef struct arv *Arv; AB.h a a RAIZ struct arv { elem info; b c b c }; struct arv* esq; struct arv* dir; AB.c e g e g 35/40

Árvore binária Operações do TAD 1. Criação de uma árvore Dois casos: seguindo a definição recursiva 1. Criar uma árvore vazia 2. Criar uma árvore com 2 subárvores (e,d): faz o papel de inserir nó 2. Verificar se árvore está vazia, mostrar o conteúdo do nó 3. Buscar o pai de um nó, buscar um nó 4. Retornar: nro de nós, nro de folhas, altura 5. Destruir árvore 6. Remover um nó Dois casos: 1. O nó não tem filhos 2. O nó tem um filho a esq, ou a dir ou os dois 7. Verificar nível de um nó 8. Verificar se é balanceada, se é perfeitamente balanceada Outras? 36/40

Operações com resolução similar: usam percursos Operações do TAD 1. Criação de uma árvore Dois casos: seguindo a definição recursiva 1. Criar uma árvore vazia 2. Criar uma árvore com 2 subárvores (e,d): faz o papel de inserir nó 2. Verificar se árvore está vazia, mostrar o conteúdo do nó 3. Buscar o pai de um nó, buscar um nó 4. Retornar: nro de nós, nro de folhas, altura 5. Destruir árvore 6. Remover um nó Dois casos: 1. O nó não tem filhos 2. O nó tem um filho a esq, ou a dir ou os dois 7. Verificar nível de um nó 8. Verificar se é balanceada, se é perfeitamente balanceada Imprime

Interface para as funções do TAD (sem pensar em erros). Insiram tratamento de erros quando tiverem implementando o TAD. typedef int elem; // Tipo exportado typedef struct arv *Arv; // Cria uma árvore vazia Arv arv_criavazia (void); // Cria uma árvore com uma raiz e duas subárvores Arv arv_cria (elem c, Arv e, Arv d); //Libera toda a memória usada na árvore a Arv arv_destroi (Arv a); // Imprime a lista a void arv_imprime (Arv a); 38/40

// Verifica se a árvore a é vazia int arv_vazia (Arv a); // Retorna o conteúdo de um nó x na árvore a elem arv_mostra_no(arv a, int *erro); //Retorna (busca) o endereço de c na árvore a. Se c não está, retorna NULL Arv arv_busca (Arv a, elem c); // Retorna (busca) o endereço do pai de x na árvore a Arv arv_busca_pai(arv a, elem x); //Remove um elemento da árvore, caso ele esteja nela. Retorna erro = 0 se sucesso e erro = 1 se não encontra void arv_remove(arv a, elem x, int *erro); 39/40

//Retorna a altura de uma árvore binária a. Considera o nível da raiz = 1 int arv_altura(arv a); // Retorna o número de nós na árvore a int arv_numero_nos(arv a); //Retorna o número de folhas da árvore a int arv_nro_folhas(arv a); //função de percurso de pre-ordem na árvore = busca em profundidade void arv_percurso_pre_ordem(arv a); //função de percurso de em-ordem na árvore void arv_percurso_em_ordem(arv a); //função de percurso de pos-ordem na árvore void arv_percurso_pos_ordem(arv a); 40/40

AB - Percursos Objetivo: Percorrer uma AB visitando cada nó uma única vez. Um percurso gera uma seqüê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. Utilização: imprimir uma árvore, atualizar um campo de cada nó, buscar um item, destruir uma árvore, etc. 41/40

AB Percursos em Árvores 3 percursos básicos para AB's: pré-ordem (Pre-order) in-ordem (In-order) pós-ordem (Post-order) A diferença entre eles está, basicamente, na ordem em que cada nó é alcançado pelo percurso Visitar um nó pode ser: Mostrar (imprimir) o seu valor; Modificar o valor do nó; Verificar se o valor pertence a árvore (membro) 42/40

Pré-ordem se árvore vazia; fim 1. visitar o nó raiz 2. percorrer em pré-ordem a subárvore esquerda 3. percorrer em pré-ordem a subárvore direita 43/40

AB - Percurso Pré-Ordem void arv_percurso_pre_ordem(arv a) { if (!arv_vazia(a)) { A printf("%d\n",a->info); // processa raiz arv_percurso_pre_ordem(a->esq); arv_percurso_pre_ordem(a->dir); B C } } D E F G H I Resultado: ABDGCEHIF 44/40

E se invertermos as chamadas recursivas? Trocar pre_ordem(a->esq); pre_ordem(a->dir); POR: pre_ordem(a->dir); pre_ordem(a->esq); Ainda é pré-ordem?? 45/40

In-Ordem se árvore vazia, fim 1. percorrer em in-ordem a subárvore esquerda 2. visitar o nó raiz 3. percorrer em in-ordem a subárvore direita 46/40

AB - Percurso In-Ordem void arv_percurso_em_ordem(arv a) { if (!arv_vazia(a)) { arv_percurso_em_ordem(a->esq); printf("%d\n",a->info); // processa raiz arv_percurso_em_ordem(a->dir); } } B A C D E F Resultado: DGBAHEICF G H I 47/40

E se invertermos as chamadas recursivas? Ainda é in-ordem? Qual o resultado para a árvore abaixo? I O I U H V D N A 48/40

Pós-ordem se árvore vazia, fim 1. percorrer em Pós-Ordem a subárvore esquerda 2. percorrer em Pós-Ordem a subárvore direita 3. visitar o nó raiz 49/40

AB - Percurso Pós-Ordem void arv_percurso_pos_ordem(arv a) { if (!arv_vazia(a)) { arv_percurso_pos_ordem(a->esq); arv_percurso_pos_ordem(a->dir); printf("%d\n",a->info); //processa raiz } } B A C D E F Resultado: GDBHIEFCA G H I 50/40

E se invertermos as chamadas recursivas? Ainda é pós-ordem?

Procedimento recursivo p/ destruir árvore, liberando o espaço alocado Usar percurso em pós-ordem Arv arv_destroi (Arv a)

Procedimento recursivo p/ destruir árvore, liberando o espaço alocado (percurso em pósordem) Porque não usamos pré ou in-ordem para esta tarefa??? Arv arv_destroi (Arv a) { if (!arv_vazia(a)) { arv_destroi(a->esq); /* libera sae */ arv_destroi(a->dir); /* libera sad */ free(a); /* libera raiz */ } return NULL; }