Arvores binárias. Fonte: https://www.tumblr.com/ PF 14 pf/algoritmos/aulas/bint.html

Documentos relacionados
Árvores e subárvores. Ilustração de uma árvore binária. Endereço de uma árvore. Maneiras de varrer uma árvore. esquerda-raiz-direita versão iterativa

ALGORITMOS em linguagem C

Árvores & Árvores Binárias

Módulo 9. Pesquisa em Memória Primária. Algoritmos e Estruturas de Dados II C++ (Rone Ilídio)

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

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

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

Universidade Federal de Mato Grosso Estrutura de Dados II

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

Árvores Binárias de Busca

Filas de prioridade. Marcelo K. Albertini. 27 de Novembro de 2014

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

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

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

ÁRVORES ABB (ÁRVORES BINÁRIAS DE BUSCAS) Sérgio Carlos Portari Júnior

Listas (Parte 1) Túlio Toffolo BCC202 Aula 09 Algoritmos e Estruturas de Dados I

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

AED2 - Aula 04 Vetores ordenados e árvores de busca

Árvores de Pesquisa (Parte I)

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

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

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

Algoritmos e Estruturas de Dados I

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

DAINF - Departamento de Informática

ALGORITMOS E ESTRUTURAS DE DADOS CES-11 Prof. Paulo André Castro Sala 110 Prédio da Computação IECE - ITA

Árvore binária - definição

Carlos Eduardo Batista. Centro de Informática - UFPB

Ordenação: Heapsort. Algoritmos e Estruturas de Dados II

Pesquisa em Memória Primária Árvores de Busca. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

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

Árvores & Árvores Binárias

Princípios de Desenvolvimento de Algoritmos MAC122 Prof. Dr. Paulo Miranda IME-USP

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

Árvores AVL e Árvores B. Jeane Melo

AED2 - Aulas 06 e 07 Árvores AVL e rubro-negras

ÁRVORES E ÁRVORE BINÁRIA DE BUSCA

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

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

ÁRVORE BINÁRIA DE BUSCA

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches Juliana de Melo Bezerra

Tabelas Hash. Prof. Túlio Toffolo BCC202 Aulas 23 e 24 Algoritmos e Estruturas de Dados I

Algoritmos e Estruturas de Dados

Filas de prioridade. Marcelo K. Albertini. 3 de Dezembro de 2013

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

BCC202 - Estrutura de Dados I

AULA 19 AULA 20. Ordenação: algoritmo Quicksort. Resumo. Melhores momentos

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

Árvores binárias de busca

Carlos Eduardo Batista. Centro de Informática - UFPB

Linguagem Haskell. Maria Adriana Vidigal de Lima

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

Árvores Binárias de Busca

Universidade Federal do ABC Avaliação Disciplina Turma Professor Data Instruções para a prova (leia antes de começar): SelectionSort selectonsortrec

Aula 07: Algoritmos de busca e Listas encadeadas

Estrutura de Dados: Aula 3 - Linguagem C

Arvores, Percursos não recursivos, Arvores heterogêneas. Aula 19

PAA-DCC-UFAM. Árvores. Universidade Federal do Amazonas Departamento de Eletrônica e Computação

Árvores binárias de busca

GGI026 - Árvore rubro-negra - Remoção

ESTRUTURA DE DADOS E ALGORITMOS. Árvores Binárias de Busca. Cristina Boeres

Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo

Estruturas de Dados. Árvores. Onde Estamos? Introdução à estrutura de dados. Alocação dinâmica de memória. Pilhas. Filas.

CES-11. Algoritmos e Estruturas de Dados. Árvores Operações sobre uma árvore Estruturas para armazenar árvores

Algoritmos e Estruturas de Dados Prof. Osório PIP/CA - Aula 05 Pag.: 1

ESTRUTURAS DE DADOS E ALGORITMOS ÁRVORE BINÁRIA

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

Árvores Binárias de Busca

Árvores Binárias de Busca

Árvores. Fabio Gagliardi Cozman. PMR2300 Escola Politécnica da Universidade de São Paulo

Ordenação: MergeSort. Prof. Túlio Toffolo BCC202 Aula 14 Algoritmos e Estruturas de Dados I

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

Estruturas de Dados II

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

ÁRVORE BINÁRIA DE BUSCA TDA-ABB

MC3305 Algoritmos e Estruturas de Dados II. Aula 06 Árvores. Prof. Jesús P. Mena-Chalco.

Vamos considerar um arquivo de dados que armazena uma lista de alunos. Cada registro é um objeto com um número de matrícula e um nome.

Árvores de Pesquisa. A árvore de pesquisa é uma estrutura de dados muito eficiente para armazenar informação.

Estruturas de Dados. Parte dos slides a seguir são adaptações, extensões e recodificações em C dos originais:

Árvores. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

INF1010 Lista de Exercícios 2

Carlos Eduardo Batista. Centro de Informática - UFPB

Árvores & Árvores Binárias

Aula T19 BCC202 Pesquisa (Parte 1) Pesquisa Binária. Túlio Toffolo

Árvores. Estruturas de Dados. Prof. Vilson Heck Junior

Estruturas de Dados I

Árvores Binárias Balanceadas Estrutura de Dados I

Árvores binárias de busca

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

Pilhas e Filas Encadeadas. Algoritmos e Estruturas de Dados I

Árvores Binárias de Busca

Aula T13 BCC202 Árvores. Túlio Toffolo

Prova 2 PMR2300 1o. semestre 2015 Prof. Thiago Martins

UNIVERSIDADE DA BEIRA INTERIOR

ÁRVORES. Prof. Yan ndre Maldonado - 1. Prof. Yandre Maldonado e Gomes da Costa

Árvores de Pesquisa (Parte I)

Estruturas de Dados Aula 11: TAD Pilha

Transcrição:

AULA 25

Arvores binárias Fonte: https://www.tumblr.com/ PF 14 http://www.ime.usp.br/ pf/algoritmos/aulas/bint.html

Mais tabela de símbolos Uma tabela de símbolos (= symbol table = dictionary) é um conjunto de objetos (itens), cada um dotado de uma chave (= key) e de um valor (= value). As chaves podem ser números inteiros ou strings ou outro tipo de dados. Uma tabela de símbolos está sujeito a dois tipos de operações: inserção: consiste em introduzir um objeto na tabela; busca: consiste em encontrar um elemento que tenha uma dada chave.

Problema Problema: Organizar uma tabela de símbolos de maneira que as operações de inserção e busca sejam razoavelmente eficientes. Em geral, uma organização que permite inserções rápidas impede buscas rápidas e vice-versa. Já vimos como organizar tabelas de símbols através de vetores, lista encadeadas e hash. Hoje: mais uma maneira de organizar uma tabela de símbolos.

Árvore binárias Uma árvore binária (= binary tree) é um conjunto de nós/células que satisfaz certas condições. Cada nó tera três campos: typedef struct celula Celula; struct celula { int conteudo; /* tipo devia ser Item*/ Celula *esq; Celula *dir; }; typedef Celula No; No x, y;

Pais e filhos Os campos esq e dir dão estrutura à árvore. Se x.esq == y, y é o filho esquerdo de x. Se x.dir == y, y é o filho direito de x. Assim, x é o pai de y se x.esq == y ou x.dir == y. Um folha é um nó sem filhos. Ou seja, se x.esq == NULL e x.dir == NULL então x é um folha

Ilustração de uma árvore binária r -1 3 31 7-6 25 10 11 42 12 dir esq esq dir conteudo No folha folha folha folha folha p raiz filho esq p filho dir p

Árvores e subárvores Suponha que r e p são (endereços de/ponteiros para) nós. p é descendente de r se p pode ser alcançada pela iteração dos comandos p = p->esq; p = p->dir; em qualquer ordem. Um nó r juntamente com todos os seus descendentes é uma árvore binária e r é dito a raiz (=root) da árvore. Para qualquer nó p, p->esq é a raiz da subárvore esquerda de p e p->dir é a raiz da subárvore direita de p.

Endereço de uma árvore O endereço de uma árvore binária é o endereço de sua raiz. typedef No *Arvore; Arvore r; Um objeto r é uma árvore binária se r == NULL ou r->esq e r->dir são árvores binárias.

Maneiras de varrer uma árvore Existem várias maneiras de percorrermos uma árvore binária. Talvez as mais tradicionais sejam: inorder traversal: esquerda-raiz-direita (e-r-d); preorder traversal: raiz-esquerda-direita (r-e-d); posorder traversal: esquerda-direita-raiz (e-d-r);

esquerda-raiz-direita Visitamos 1. a subárvore esquerda da raiz, em ordem e-r-d; 2. depois a raiz; 3. a subárvore direita da raiz, em ordem e-r-d; void inordem(arvore r) { if (r!= NULL) { inordem(r->esq); printf("%d\n", r->conteudo); inordem(r->dir); } }

esquerda-raiz-direita versão iterativa void inordem(arvore r) { stackinit(); while (r!= NULL!stackEmpty()) { if (r!= NULL) { stackpush(r); r = r->esq; } else { r = stackpop(); printf("%d\n", r->conteudo); r = r->dir; } }

Ilustração de percursos em árvores binárias conteudo esq dir No raiz 12 esq dir -1 3 r 31 7-6 25 10 11 42 in-ordem (e-r-d): 31-1 7 12 10-6 11 3 42 25 pré-ordem (r-e-d): 12-1 31 7 3-6 10 11 25 42 pós-ordem (e-d-r): 31 7-1 10 11-6 42 25 3 12

Ilustração de percursos em árvores binárias conteudo esq dir No raiz + esq dir * / r 31 27 - not 10 11 True in-ordem (e-r-d): 31 * 27 + 10-11 / True not pré-ordem (r-e-d): + * 31 27 / - 10 11 not True pós-ordem (e-d-r): 31 27 * 10 11 - True not / +

Primeiro nó esquerda-raiz-direita Recebe a raiz r de uma árvore binária não vazia e retorna o primeiro nó na ordem e-r-d No *primeiro(arvore r) { while (r->esq!= NULL) r = r->esq; return r; }

Altura A altura de p é o número de passos do mais longo caminho que leva de p até uma folha. A altura de uma árvore é a altura da sua raiz. Altura de árvore vazia é -1. #define MAX(a,b) ((a) > (b)? (a): (b)) int altura(arvore r) { if (r == NULL) return-1; else { int he = altura(r->esq); int hd = altura(r->dir); return MAX(he,hd) + 1; }

Árvores balanceadas A altura de uma árvore com n nós é um número entre lg(n) e n. Uma árvore binária é balanceada (ou equilibrada) se, em cada um de seus nós, as subárvores esquerda e direita tiverem aproximadamente a mesma altura. Árvores balanceadas têm altura próxima de lg(n). O consumo de tempo dos algoritmos que manipulam árvores binárias dependem frequentemente da altura da árvore.

Nós com campo pai Em algumas aplicações é conveniente ter acesso imediato ao pai de qualquer nó. typedef struct celula Celula; struct celula { int conteudo; /* tipo devia ser Item*/ Celula *pai; Celula *esq; Celula *dir; }; typedef Celula No; typedef No *Arvore;

Ilustração de nós com campo pai 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 r -1 3 31 7-6 25 10 11 42 12 dir esq raiz esq dir conteudo No pai

Sucessor e predecessor Recebe o endereço p de um nó de uma árvore binária não vazia e retorna o seu sucessor na ordem e-r-d. No *sucessor(no *p) { if (p->dir!= NULL) { No *q= p->dir; while (q->esq!= NULL) q = q->esq; return q; } while (p->pai!=null && p->pai->dir==p) p = p->pai; return p->pai; } Exercício: função que retorna o predecessor.

Árvores binárias de busca Fonte: http://infosthetics.com/archives/ PF 15 http://www.ime.usp.br/ pf/algoritmos/aulas/binst.html

Árvore binárias de busca Considere uma árvore binária cujos nós têm um campo chave (como int ou String, por exemplo). typedef struct celula Celula; struct celula { int conteudo; /* tipo devia ser Item*/ int chave; /* tipo devia ser Chave*/ Celula *esq; Celula *dir; }; typedef Celula No; typedef No *Arvore; No x, *p, *q, *r, *t;

Árvore binárias de busca Uma árvore binária deste tipo é de busca (em relação ao campo chave) se para cada nó x x.chave é 1. maior ou igual à chave de qualquer nó na subárvore esquerda de x e 2. menor ou igual à chave de qualquer nó na subárvore direita de x. Assim, se p é um nó qualquer então vale que q->chave <= p->chave e p->chave <= t->chave para todo nó q na subárvore esquerda de p e todo nó t na subárvore direita de p.

Ilustração de uma árvore binária de busca r dir esq esq dir No p raiz conteudo chave -6-1 7 25 31 10 12 42 11 3 filho dir p filho esq p in-ordem (e-r-d): -6-1 3 7 10 11 12 25 31 42

Busca Recebe um inteiro k e uma árvore de busca re retorna um nó cuja chave é k; se tal nó não existe, retorna NULL. No *busca(arvore r, int k) { if (r == NULL r->chave == k) return r; } if (r->chave > k) return busca(r->esq, k); return busca(r->dir, k);

Busca versão iterativa Recebe um inteiro k e uma árvore de busca r e retorna um nó cuja chave é k; se tal nó não existe, retorna NULL. No *busca(arvore r, int k) { while (r!= NULL && r->chave!= k) if (r->chave > k) r = r->esq; else r = r->dir; return r; }

Inserção Recebe uma árvore de busca r e um nó novo. Insere o nó no lugar correto da árvore de modo que a árvore continue sendo de busca e retorna o endereço da nova árvore. No * new(int chave,int conteudo,no *esq,no*dir) { No *novo = mallocsafe(sizeof *novo); novo->chave= chave; novo->conteudo = conteudo; novo->esq = esq; novo->dir = dir; return novo;

Inserção Arvore *insere(arvore r, No *novo) { No *f, /* filho de p */ No *p; /* pai de f */ if (r == NULL) return novo; f = r; while (f!= NULL) { p = f; if (f->chave > novo->chave) f = f->esq; else f = f->dir; }

Inserção } /* novo sera uma folha novo sera filho de p */ if (p->chave > novo->chave) p->esq = novo; else p->dir = novo; return r;

Remoção Recebe uma árvore de busca não vazia r. Remove a sua raiz e rearranja a árvore de modo que continue sendo de busca e retorna o endereço da nova árvore.

Remoção Arvore *removeraiz(arvore r) { No *p, *q; if (r->esq == NULL) { q = r->dir; free(r); return q; } /* encontre na subarvore r->esq o nó q com maior valor */ p = r; q = r->esq; while (q->dir!= NULL) { p = q; q = q->dir; }

Remoção } /* q é o nó anterior a r na ordem e-r-d p é o pai de q*/ if (p!= r) { p->dir = q->esq; q->esq = r->esq; } q->dir = r->dir; free(r); return q;

Consumo de tempo O consumo de tempo das funções busca, insere e removeraiz é, no pior caso, proporcional à altura da árvore. Conclusão: interessa trabalhar com árvores balanceadas: árvores AVL, árvores rubro-negras, árvores...

Comentários finais Fonte: http://www.quickmeme.com/ MACO122 Edição 2014

Livros Nossa referência básica foi o livro PF = Paulo Feofiloff, Algoritmos em linguagem C, Este livro é baseado no material do sítio Projeto de Algoritmos em C. Outro livro foi S = Robert Sedgewick, Algorithms in C, vol. 1

MAC0122 MAC0122 foi uma disciplina introdutória em: Projeto de algoritmos: recursão: torres de Hanoi,..., EP2, EP5... divisão-e-conquista: Mergesort, Quicksort, EP5 pré-processamento: Heapsort, Boyer-Moore heurísticas: Boyer-Moore, EP5 algoritmos de enumeração: EP1, nrainhas algoritmos de busca: busca binária, busca em listas (EP2,EP3,EP4,EP5), hashing (EP5), busca em árvores, busca em largura (distancias), busca em profundidade (EP2) programação dinâmica ( recursão com tabela ): números binomiais,...

MAC0122 MAC0122 foi uma disciplina introdutória em: Correção de algoritmos: relações invariantes: vários problemas nas aulas

MAC0122 MAC0122 foi uma disciplina introdutória em: Eficiência de algoritmos: consumo de tempo: vários problemas nas aulas notação assintótica O: vários problemas nas aulas análise experimental: vários problemas nas aulas consumo de espaço: Mergesort usa espaço extra O(n), Quicksort usa espaço extra O(lg n)

MAC0122 MAC0122 foi uma disciplina introdutória em: Estruturas de dados: listas lineares encadeadas, listas encadeadas ciculares, listas com e sem cabeça: EP2, EP3, EP4 e EP5 filas: distâncias, EP2, EP3 pilhas: EP2, EP3, EP4 heaps tabelas de símbolos: lista ligadas (EP3), hash (EP5), árvores

MAC0122 MAC0122 combinou conceitos e recursos de programação: recursão: EP2, EP5 strings: todos os EPs? endereços e ponteiros: EP2, EP3, EP4 e EP5 registros e structs: EP2, EP3, EP4, e EP5 alocação dinâmica de memória: EP2, EP3, EP4, e EP5 interfaces: (EP1), EP2, EP3, EP4, e EP5 que nasceram de aplicações cotidianas em ciência da computação: bsearch (stdlib), qsort (stdlib), strstr (string), hsearch (search), lsearch (search), tsearch (search),...

Tudo isso regado a muita análise de eficiência de algoritmos e invariantes. Principais tópicos Alguns dos tópicos de MAC0122 foram: recursão; busca em um vetor; busca (binária) em vetor ordenado; listas encadeadas; listas lineares: filas e pilhas; algoritmos de enumeração; divisão e conquista; busca de palavras em um texto; algoritmos de ordenação: bubblesort, heapsort, mergesort,... ;

Pausa para nossos comerciais EP5: 6/DEZ Prova 3: terça-feira, 25/OUT Prova Sub: terça-feira, 2/DEZ

Fonte: http://dawallpaperz.blogspot.com.br/