Árvores e Árvores Binárias



Documentos relacionados
ESTRUTURAS DE DADOS II MSc. Daniele Carvalho Oliveira

- UNIVERSIDADE DO VALE DO RIO DOS SINOS CIÊNCIAS EXATAS E TECNOLÓGICAS Curso: Informática / Ciência da Computação

Estruturas de Dados. Prof. Gustavo Willam Pereira Créditos: Profa. Juliana Pinheiro Campos

PROGRAMAÇÃO II 4. ÁRVORE

EAD Árvore árvore binária

Algoritmos e Estruturas de Dados: Árvore Binária

- UNIVERSIDADE DO VALE DO RIO DOS SINOS CIÊNCIAS EXATAS E TECNOLÓGICAS Curso: Informática / Ciência da Computação

ESTRUTURA DE DADOS DCC013

ESTRUTURA DE DADOS PILHA

Avaliação de Expressões

FACULDADE CAMPO LIMPO PAULISTA MESTRADO EM CIÊNCIA DA COMPUTAÇÃO. Projeto e Análise de Algoritmos II Lista de Exercícios 2

Algoritmos e Estruturas de Dados 2

Árvores AVL. Prof. Othon M. N. Batista Estrutura de Dados

FUNDAÇÃO EDUCACIONAL DE ITUIUTABA

Árvores. Algoritmos e Estruturas de Dados 2005/2006

Métodos Computacionais. Árvores

Linguagem C: Árvores Binarias

Busca. Pesquisa sequencial

PROGRAMAÇÃO II 3. FILA DINÂMICA

Algoritmos e Estrutura de Dados III. Árvores

PROGRAMAÇÃO II 3. PILHA DINÂMICA

INF1007: Programação 2 10 Árvores Binárias. (c) Dept. Informática - PUC-Rio 1

Árvores Binárias e Busca. Jeane Melo

Estruturas de Dados Pilhas, Filas e Deques

ALGORITMOS E ESTRUTURAS DE DADOS CES-11 CES-11 CES-11

INF 1007 Programação II

ESTRUTURAS DE DADOS II

Complexidade de Algoritmos

Árvores Binárias de Busca

Árvores Binárias de Busca

BC1424 Algoritmos e Estruturas de Dados I. Aula 16: Árvores (introdução) Prof. Jesús P. Mena-Chalco. jesus.mena@ufabc.edu.br

Figura 13.1: Um exemplo de árvore de diretório.

Fila de Prioridade. Siang Wun Song - Universidade de São Paulo - IME/USP. MAC Estruturas de Dados

DAS5102 Fundamentos da Estrutura da Informação

Árvores Binárias Balanceadas

Árvore Binária de Busca

Estruturas de Dados Árvores

Pedro Vasconcelos DCC/FCUP. Programação Funcional 15 a Aula Árvores de pesquisa

Estruturas de Dados Aula 15: Árvores 17/05/2011

{ fazer Pós-Ordem sem recursividade. Poderá cair na prova!!! }

CT-234. Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches

Geração de código intermediário. Novembro 2006

Representação de Algoritmos - Linguagens de Programação

UFSC-CTC-INE INE Estruturas de Dados. Árvores. Prof. Ronaldo S. Mello 2002/2. Árvore

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

Estrutura de Dados Árvores. Prof. Robinson Alves

O modelo do computador

Análise semântica. Análise Semântica. Estrutura de um compilador. Anotação da árvore sintática. Tipos de comunicação de atributos?

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

2ª Lista de Exercícios

Métodos Os métodos de uma classe podem ser classificados como construtores, destrutores, funções ou procedimentos.

Estruturas de Dados. Árvores Parte II: O TAD Árvore. EDs & Algoritmos. Operações Genéricas: Operações de Consulta: Operações de Acesso:

Linguagem de Programação

Sintaxe e Semântica. Fases da Compilação. programa fonte

1. Introdução Definição Conceitos relacionados... 2

Variáveis Compostas Heterogêneas. Variável Composta Heterogênea. Variável Composta Heterogênea

Armazenamento de Dados. Prof. Antonio Almeida de Barros Junior

PROG. DE COMPUTADORES II SI Arquivos

1. Estrutura de seleção. Seleção: algumas etapas (passos) do algoritmo são executadas dependendo do resultado de uma condição

ESTRUTURAS DE DADOS I. Notas de Aula. Prof. Dr. Gilberto Nakamiti

Curso : Tecnologia em Desenvolvimento de Sistemas - AEMS

ESTRUTURA DE DADOS -VARIÁVEIS COMPOSTAS. Prof. Angelo Augusto Frozza, M.Sc.

Algumas notas sobre PASCAL

De uma forma ampla, o profissional egresso deverá ser capaz de desempenhar as seguintes funções:

Estruturas de Dados I

Árvores Binárias - continuação

Busca em Espaço de Estados

Estrutura de Dados. Introdução a Ponteiros. Prof. Gerson Borges Estrutura de Dados I 1

Universidade Estadual de Mato Grosso do Sul - Curso de Ciência da Computação Disciplina: Estruturas de Dados Profª. Raquel Marcia Müller

26/08/2013. Árvore. Árvore. Árvore. Floresta :: Exemplo. Floresta ÁRVORES

Geração de código. Ivan Ricarte INTRODUÇÃO À COMPILAÇÃO

Apostila de Fundamentos de Programação I. Prof.: André Luiz Montevecchi

Projetos. Universidade Federal do Espírito Santo - UFES. Mestrado em Informática 2004/1. O Projeto. 1. Introdução. 2.

Compiladores Aula 5. Celso Olivete Júnior.

JSP - ORIENTADO A OBJETOS

Filas COMANDOS EM C++ PARA IMPLEMENTAÇÃO DE UMA FILA. Biblioteca padrão <queue>

Classificação e Pesquisa de Dados

EAD Árvore - representação usando listas ligadas

Resolução de problemas e desenvolvimento de algoritmos

B D. Árvores Ordenadas

CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES

Bases Matemáticas. Aula 2 Métodos de Demonstração. Rodrigo Hausen. v /15

Árvore Binária de Busca. Algoritmos e Estrutura de Dados II. Operações Busca e Sucessor. Árvore Binária de Busca. Árvores Rubro-Negras

Árvores Binárias. Observação: Material elaborado a partir do material do Professor Marcos Costa.

- UNIVERSIDADE DO VALE DO RIO DOS SINOS CIÊNCIAS EXATAS E TECNOLÓGICAS Curso: Informática / Ciência da Computação

Banco de Dados Profa. Dra. Cristina Dutra de Aguiar Ciferri. Banco de Dados Processamento e Otimização de Consultas

Algoritmos e Estrutura de Dados II. Apresentação. Prof a Karina Oliveira. kkco@dei.unicap.br

Árvores Binárias de Pesquisa. Programação II Prof. Mateus Raeder. Árvores Binárias de Pesquisa. Árvores Binárias de Pesquisa. Classe Nodo Binário

Filas. A ordem de saída corresponde diretamente à ordem de entrada dos elementos. Fila de caixa bancário

Árvores Balanceadas. Árvore binária completamente balanceada. Ocorre quando a árvore está cheia ou quase cheia com o nível n-1 completo

Métodos de Pesquisa em Memória Primária

Linguagem algorítmica: Portugol

Programando Jogos com Delphi (LÓGICA, ANIMAÇÃO, CONTROLE) Autor: Antônio Sérgio de Sousa Vieira

Programação Estruturada. Programação Estruturada. Idéias Básicas da Programação Estruturada

Projeto e Análise de Algoritmos Projeto de Algoritmos Tentativa e Erro. Prof. Humberto Brandão humberto@bcc.unifal-mg.edu.br

Manipulação de Arquivos em Pascal

MÉTODOS DE ORDENAÇÃO

Transcrição:

MAC 5710 - Estruturas de Dados - 2008

Referência bibliográfica Os slides sobre este assunto são parcialmente baseados nas seções sobre árvores do capítulo 4 do livro N. Wirth. Algorithms + Data Structures = Programs. Prentice Hall, 1976.

Árvore Uma árvore do tipo T é constituída de uma estrutura vazia, ou um elemento ou um nó do tipo T chamado raiz com um número finito de árvores do tipo T associadas, chamdadas as sub-árvores da raiz. A B C D E F G H I J K L

Nomenclatura: árvore ordenada Uma árvore é chamada ordenada quando a ordem das subárvores é significante. Assim, as duas árvores ordenadas seguintes são diferentes. A B C D A C D B Numa árvore que representa os descendentes de uma família real, a ordem das subárvores pode ser importante pois pode determinar a ordem de sucessão da coroa.

Nomenclatura: pai, filho, nível A B C D E F G H I J K L Pai e filho: Um nó y abaixo de um nó x é chamado filho de x. x é dito pai de y. Exemplo: B é pai de E e F. Irmão: Nós com o mesmo pai são ditos irmãos. Exemplo: B, C, D são irmãos. Nível de um nó: A raiz de uma árvore tem nível 1. Se um nó tem nível i, seus filhos têm nível i + 1. Exemplo: E, F, G e H têm nível 3.

Nomenclatura: altura, folha, grau A B C D E F G H I J K L Altura ou profundidade de uma árvore: É o máximo nível de seus nós. A árvore do exemplo tem altura 4. Folha ou nó terminal: É um nó que não tem filhos. Exemplo: I, J, K, L são folhas. Nó interno ou nó não terminal: É um nó que não é folha. Grau de um nó: É o número de filhos do nó. Exemplo: B tem grau 2, G tem grau 1.

Nomenclatura: grau de árvore, árvore binária A B C D E F G H I J K L Grau de uma árvore: É o máximo grau de seus nós. A árvore do exemplo tem grau 3. Usando a nomenclatura vista, podemos definir a árvore binária. Árvore binária: É uma árvore ordenada de grau 2.

Árvore binária Uma árvore binária é vazia ou um nó chamado raiz mais duas árvores binárias disjuntas chamadas subárvore esquerda e subárvore direita. Exemplo * / + + - e f a b c d Pode representar a expressão aritmática: ((a + b) /(c d)) (e + f ) Veja como a estrutura de árvore binária expressa de maneira clara a precedência das operações, sem necessidade de usar parêntesis.

Aplicações que usam árvores e árvore binárias Problemas de busca de dados armazenados na memória principal do computador: árvore binária de busca, árvores (quase) balanceadas como AVL, rubro-negra, etc. Problemas de busca de dados armazenados na memória secundárias principal do computador (disco rígico): e.g. B-árvores. Aplicações em Inteligência Artificial: árvores que representam o espaço de soluções, e.g. jogo de xadrez, resolução de problemas, etc. No processamento de cadeias de caracteres: árvore de sufixos. Na gramática formal: árvore de análise sintática. Em problemas onde a meta é achar uma ordem que satisfaz certas restrições (e.g. testar a propriedade de uns-consecutivos numa matriz, reconhecer grafos intervalo, planaridade de grafo, etc.): árvore-pq.

Implementação de uma árvore binária Em Pascal podemos declarar o registro node assim: type node = record key: integer; left, right: node end Vamos fazer um pequeno exercício: construir uma árvore binária constituída de n nós, para um dado n, que tenha mínima altura. Para isso, vamos alocar o máximo numero possível de nós em cada nível da árvore, exceto no último que pode estar incompleto. Podemos distribuir nós em igual quantidade para a esquerda e a direita de cada nó. Teremos uma árvore perfeitamente balanceada.

Construção de uma árvore perfeitamente balanceada Árvore perfeitamente balanceada: para todo nó da árvore, os números de nós das suas duas subárvores diferem no máximo em um. Seja a função tree(n) que gera uma árvore perfeitamente balanceada com n nós. Informalmente tree(n) pode ser definida recursivamente assim: 1 Aloque um nó para ser a raiz. 2 Coloque na esquerda da raiz uma árvore gereada por tree(nl = n div 2). 3 Coloque na direita da raiz uma árvore gereada por tree(nr = n n l 1). Veremos exemplos de árvores assim construídas.

Árvore perfeitamente balanceada com n = 1 n = 1

Árvore perfeitamente balanceada com n = 2 n = 2

Árvore perfeitamente balanceada com n = 3 n = 3

Árvore perfeitamente balanceada com n = 4 n = 4

Árvore perfeitamente balanceada com n = 5 n = 5

Árvore perfeitamente balanceada com n = 6 n = 6

Árvore perfeitamente balanceada com n = 7 n = 7

Progama em Pascal - livro de N. Wirth type ref = node; node = record key: integer; left, right: ref end; var n: integer; root: ref; function tree(n: integer): ref; var newnode: ref; x, nl, nr: integer; begin { constrói uma árvore perf. balanceada de n nós} if n = 0 then tree:=nil else begin nl:= n div 2; nr:= n - nl - 1; read(x); new(newnode); begin newnode.key:=x; newnode.left:=tree(nl); newnode.right:=tree(nr) end; tree:=newnode end end

Formas de percorrer uma árvore Em algumas aplicações, é necessário percorrer uma árvore de forma sistemática, visitando cada nó da árvore uma única vez, em determinada ordem. Por exemplo, se cada nó da árvore possui um campo que armazena o salário, então podemos querer visitar cada nó para fazer um reajuste salarial. A visita seria atualizar o campo salário. Não podemos esquecer nenhum nó, nem queremos visitar um nó mais do que uma vez. Neste caso, a ordem de visita não é importante. Mas em algumas outras aplicações, queremos visitar os nós em certa ordem desejada. Veremos várias formas para percorrer uma árvore binária. Pré-ordem. In-ordem ou ordem simétrica. Pós-ordem.

Percorrer uma árvore binária em pré-ordem Percorrer uma árvore binária em pré-ordem: 1 Vistar a raiz. 2 Percorrer a sua subárvore esquerda em pré-ordem. 3 Percorrer a sua subárvore direita em pré-ordem. Visitar um nó significa executar uma certa ação no nó.

Exemplo de percurso em pré-ordem Percorrer uma árvore binária em pré-ordem: 1 Vistar a raiz. 2 Percorrer a sua subárvore esquerda em pré-ordem. 3 Percorrer a sua subárvore direita em pré-ordem. A B C D E F G H I Percurso em pré-ordem: A B D C E G F H I O percurso em pré-ordem segue os nós até chegar os mais profundos, em ramos de subárvores da esquerda para a direita. É conhecida usualmente pelo nome de percurso em profundidade (depth-first).

Exemplo de percurso em pré-ordem Percorrer uma árvore binária em pré-ordem: 1 Vistar a raiz. 2 Percorrer a sua subárvore esquerda em pré-ordem. 3 Percorrer a sua subárvore direita em pré-ordem. A B C D E F G H I Percurso em pré-ordem: A B D C E G F H I O percurso em pré-ordem segue os nós até chegar os mais profundos, em ramos de subárvores da esquerda para a direita. É conhecida usualmente pelo nome de percurso em profundidade (depth-first).

Procedimento pre-order em Pascal É fácil escrever um procedimento recursivo para realizar a pré-ordem. Em Pascal: type ref = node; node = record key: integer; left, right: ref end; procedure pre-order(t: ref); begin if t nil then begin visita(t); pre-order(t.left); pre-order(t.right); end end

Percorrer uma árvore binária em in-ordem Percorrer uma árvore binária em in-ordem: 1 Percorrer a sua subárvore esquerda em in-ordem. 2 Vistar a raiz. 3 Percorrer a sua subárvore direita em in-ordem. A in-ordem visita a raiz entre as ações de percorrer as duas subárvores. É conhecida também pelo nome de ordem simétrica.

Exemplo de percurso em in-ordem Percorrer uma árvore binária em in-ordem: 1 Percorrer a sua subárvore esquerda em in-ordem. 2 Vistar a raiz. 3 Percorrer a sua subárvore direita em in-ordem. A B C D E F G H I Percurso em in-ordem: D B A E G C H F I

Procedimento in-order em Pascal É fácil escrever um procedimento recursivo para realizar a in-ordem. Em Pascal: type ref = node; node = record key: integer; left, right: ref end; procedure in-order(t: ref); begin if t nil then begin in-order(t.left); visita(t); in-order(t.right); end end

Exemplo de percurso em in-ordem Queremos imprimir os nós de uma árvore binária apontada por t em uma impressora do tipo matricial, em que cada linha é impressa de cada vez. A visita de um nó significa imprimi-lo pela impressora. A ordem de visita dos nós é quase a in-ordem, que chamaremos de in -ordem, com a simples inversão na ordem de percurso das duas subárvores: Percorrer uma árvore binária em in -ordem: 1 Percorrer a sua subárvore direita em in -ordem. 2 Vistar a raiz. 3 Percorrer a sua subárvore esquerda em in -ordem. A B C D E Árvore impressa: A C B E D

Procedimento de impressão em Pascal O livro de Wirth apresenta o seguinte procedimento para imprimir uma árvore binária. Note a sua semelhança com a in-ordem, trocando-se apenas left com right. type ref = node; node = record key: integer; left, right: ref end; procedure print-tree(t: ref; h: integer); var i: integer; begin {imprime árvore t com indentação h} if t nil then begin print-tree(t.right, h+1); for i:= 1 to h do write( ); writeln(t.key); print-tree(t.left, h+1); end end

Percorrer em in-ordem sem usar recursão A recursão facilita a escrita do algoritmo de percurso, mas podemos fazer o percurso, digamos em in-ordem, sem usar recursão. Para isso usamos uma pilha. Suponhamos que já existem as rotinas push e pop. O apontador t aponta para a árvore binária a ser percorrida. in-order(t): 1: p t 2: while p nil or pilha não vazia do 3: if p nil then 4: push(p) 5: p left(p) 6: else 7: pop(p) 8: visita(p) 9: p right(p) 10: end if 11: end while

Percorrer uma árvore binária em pós-ordem Percorrer uma árvore binária em pós-ordem: 1 Percorrer a sua subárvore esquerda em pós-ordem. 2 Percorrer a sua subárvore direita em pós-ordem. 3 Vistar a raiz.

Exemplo de percurso em pós-ordem Percorrer uma árvore binária em pós-ordem: 1 Percorrer a sua subárvore esquerda em pós-ordem. 2 Percorrer a sua subárvore direita em pós-ordem. 3 Vistar a raiz. A B C D E F G H I Percurso em pós-ordem: D B G E H I F C A

Outro exemplo de percurso em pós-ordem Percorrer uma árvore binária em pós-ordem: 1 Percorrer a sua subárvore esquerda em pós-ordem. 2 Percorrer a sua subárvore direita em pós-ordem. 3 Vistar a raiz. Exemplo * / + + - e f a b c d Percurso em pós-ordem: a b + c d / e f + A representação de uma expressão aritmética com o operador no final dos operandos é conhecida pelo nome de notação reversa ou polonesa.

Outro exemplo de percurso em pós-ordem Percorrer uma árvore binária em pós-ordem: 1 Percorrer a sua subárvore esquerda em pós-ordem. 2 Percorrer a sua subárvore direita em pós-ordem. 3 Vistar a raiz. Exemplo * / + + - e f a b c d Percurso em pós-ordem: a b + c d / e f + A representação de uma expressão aritmética com o operador no final dos operandos é conhecida pelo nome de notação reversa ou polonesa.

Procedimento post-order em Pascal É fácil escrever um procedimento recursivo para realizar a pós-ordem. Em Pascal: type ref = node; node = record key: integer; left, right: ref end; procedure post-order(t: ref); begin if t nil then begin post-order(t.left); post-order(t.right); visita(t); end end

Percurso em largura Há ainda outras formas usuais para percorrer uma árvore. Percurso em largura ou em nível (breadth-first): percorre a árvore em ordem crescente de seus níveis e, em cada nível, da esquerda para a direita. Uma fila é usada para realizar este percurso. A B C D E F G H I Percurso em largura: A B C D E F G H I

Aplicações que usam percurso de árvores Há várias aplicações que se baseiam em percurso de árvores. Adota-se uma ordem apropriada de percurso. Usa-se uma rotina adequada para visitar cada nó. Exercícios: 1 Considere uma árvore binária dada onde cada nó tem um campo adicional chamado alt. Escreva um algoritmo que coloque no campo alt de cada nó x da árvore binária a altura da subárvore enraizada em x. Dica: use pós-ordem e uma rotina apropriada de visita. Tente fazer este exercício e veja o por que da adoção da pós-ordem. 2 Em algumas situações, é desejável ter um campo adicional pai em cada nó da árvore que aponta para o nó pai. No caso de raiz, o seu campo pai deve apontar para nil. Suponha uma árvore binária existente que reservou este campo pai em cada nó mas apenas os campos key, left e right estão definidos. Escreva uma algoritmo para definir o