computação iiianteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas,...

Post on 07-Jul-2020

5 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Computação III Professor: Mtr. David Batard Lorenzo

Instituto Superior para as Tecnologias de Informção e Telecomunicação

ISUTIC

Computação III

• David Batard Lorenzo

Cubano.

Bacharel em Ciência da Computação (2004)

Mestrado em Ciências da Computação (2007)

Professor Assistente (2009)

Apresentação do professor

Estruturas de dados no lineares

Título: Recursão. O TDA Árvore.

Bibliografia da matéria

–Aho, Hopcroft, Ullman. Estructura de Datos y

Algoritmos.

– CORMEN, T. H. et al. Algoritmos: Teoria e Prática; Rio

de Janeiro: Editora Campus, 2002.

– Thomas H. Cormen, Charles E. Leiserson. Introduction

to Algorithms. Second Edition.

–TAMASSIA, R. e GOODRICH, M. T. Estruturas de

Dados e Algoritmos em JAVA; Porto Alegre: Editora

Bookman, 2002.

Objectivos

• Caracterizar o funcionamento dos algoritmos recursivos.

• Caracterizar o TDA Árvore e sua implementação

Lembrete:

Estrutura de dados

• Coleção de variáveis,

• relacionados de alguma forma

• que definiu um conjunto de operações

• que satisfaçam determinadaspropriedades.

Lembrete

Tipo de Dado Abstrato

• Modelo matemático

• consiste em um conjunto de dados

• e as operações definidas para esseconjunto de dados.

Lembrete

Tipo de Dado Abstrato

TDA

Estrutura de Dados

Operações

Sumário

• Conceito de recursão.

• Partes de um algoritmo recursivo.

• Definições de árvore. Definição recursiva de árvore.

• Terminologia relacionada com o TDA Árvore.

• Percorridos em árvores.

• Definição do TDA Árvore. Operações e

representação.

Exemplos de conceitos recursivos

Há conceitos que se utilizam a si mesmos para se explicar.

- Um ramo de uma árvore tem ramos…

Exemplos de conceitos recursivos

- Os ficheiros e pastas de um disco de computadores alojam-seem pastas…

Exemplos de conceitos recursivos

- As Matriuskas Russas (bonecas de madeira ou varro que contêmoutras bonecas iguais mas mais pequenas dentro)

Algoritmo Recursivo

Há algoritmos que se explicam em termos de si mesmos. Umalgoritmo que se define parcialmente em termos de si mesmos sedenomina recursivo.

(Epígrafe 9 pág. 1 del Katrib)

Algoritmo Recursivo

O método recursivo é um método que chama a si própriodiretamente ou indiretamente, através de outro método.

(Epígrafe 6.12, pág. 286 del “Java ,como programar”/H.M.Deitei

LangLisboa.-4,ed.-PortoAlegre:Bookman,2003) En Portugues

Exemplo de Algoritmo RecursivoUm exemplo de função recorrente é a definição dada para ocálculo do factorial de um número.

1. O Factorial de 0 é 1.

2. O Factorial de um n > 0 é

n * Factorial de n-1.

Exemplo de Algoritmo RecursivoA Sucessão de Fibonacci define-se mediante a função derecurrencia.

f0 = 0

f1 = 1

fn = fn-1 + fn-2 (n ≥ 2)

Partes de um Algoritmo RecursivoCaso base:

• Parte mais simples.

• Caso ou casos triviais para os que se conhece umasolução direta.

Parte ou etapa recursiva:

• Parte mais complexa.

• Parte onde se faz alusão à própria definição.

Mais sobre os Algoritmos Recursivos

1.Pode ter mais de um caso base e a parte recursiva podecontar com mais de uma instrução.

2.O caso base actua como condição de terminação darecursividad. Sem a existência ou identificação do caso base arotina chamar-se-ia indefinidamente.

Mais sobre os Algoritmos Recursivos

3.A parte recursiva é a que encarregar-se-á de dividir o problemagrande num mais pequeno até chegar a uma solução direta ousingela que será um dos casos baseie..

Es de suma importancia que la parte recurrente converja a un casobase para lograr la terminación del algoritmo.

Problema (Factorial)

Execução:

factorial(3) = 3*factorial(2) = 3 * (2 * factorial(1)) = 3*(2*(1*factorial(0))) = 3*2*1= 6.

Constrói-se a solução para n=3 a partir do caso base..

Solução:

public int factorial(int n) {

if(n == 0)

return 1;

return n * factorial(n-1);

}

¿Como funciona um método recursivo?

public static void main(String []args){

int x = 3;

int fac = factorial(x);

}

public static void main(String []args){

int x = 3;

int fac = factorial(x);

factorial(3){

if (3==0) return 1;

return 3*factorial(3-1);}

public static void main(String []args){

int x = 3;

int fac = factorial(x);

factorial(3){

if (3==0) return 1;

return 3*factorial(3-1);

factorial(2){

if (2==0) return 1;

else return 2*factorial(2-1);

public static void main(String []args){

int x = 3;

int fac = factorial(x);

factorial(3){

if (3==0) return 1;

return 3*factorial(3-1);

factorial(2){

if (2==0) return 1;

return 2*factorial(2-1);

factorial(1){

if (1==0) return 1;

return 1*factorial(1-1);

public static void main(){

int x = 3;

int fac = factorial(x);

factorial(3){

if (3==0) return 1;

return 3*factorial(3-1);

factorial(2){

if (2==0) return 1;

return 2*factorial(2-1);

factorial(1){

if (1==0) return 1;

return 1*factorial(1-1);

caso base atingido !!

factorial(0){

if (0==0) return 1;

public static void main(){

int x = 3;

int fac = factorial(x);

factorial(3){

if (3==0) return 1;

return 3*factorial(3-1);

factorial(2){

if (2==0) return 1;

return 2*factorial(2-1);

factorial(1){

if (1==0) return 1;

return 1*1;

public static void main(){

int x = 3;

int fac = factorial(x);

factorial(3){

if (3==0) return 1;

return 3*factorial(3-1);

factorial(2){

if (2==0) return 1;

return 2*1;

public static void main(){

int x = 3;

int fac = factorial(x);

factorial(3){

if (3==0) return 1;

return 3*2;

public static void main(String []args){

int x = 3;

int fac = 6;

}

Anteriormente tinha-se estudado as estruturas de dadoslineares (listas, pilhas, filas). Nas que a cada elemento tinhaum elemento diante e outro detrás e para o percorrer erasuficiente seguir um caminho em linha reta.

No entanto não sempre podemos resolver os problemasusando este tipo de estrutura.

Estruturas de Dados LinearesNão podem representar todo o tipo de problemas

Estruturas de Dados no Lineares

Representam os dados de maneira

bem mais próxima à realidade

Árvore

A estrutura de árvore expressa umarelação hierárquica entre os elementosde um conjunto dado.

Exemplo: Representação da estrutura de um exército

Estado Maior FAA

Região Militar Norte Região Militar Centro Região Militar Sur

Regimento1 Regimento2 Regimento 3

Esquadrão1 Esquadrão2 Esquadrão3

Soldado1 Soldado2 Soldado3

… …

… …

… …

Outros exemplos de árvores

Índice de um livro

Árvore genealógico

Sistema de arquivos Unix

Figura

+Figura()

+CalcularArea() : double

+CalcularPerimetro() : double

Círculo

- centro: Punto

- radio : double

+Círculo(p1: Punto, r: double)

Triángulo

- Punto1: Punto

- Punto2: Punto

- Punto3: Punto

+Triángulo( p1: Punto, p2: Punto, p3:

Punto)

Paralelogramo

- Punto1: Punto

- Punto2: Punto

- Punto3: Punto

- Punto4: Punto

+ Paralelogramo ( p1: Punto, p2:

Punto, p3: Punto, p4: Punto)

Rectángulo

+ Rectángulo(supIzq: Punto,

supDer: Punto,

infIzq: Punto, infDer: Punto)

Cuadrado

+ Rectángulo(supIzq: Punto,

supDer: Punto,

infIzq: Punto, infDer: Punto)

Rombo

+ Paralelogramo ( p1: Punto, p2:

Punto, p3: Punto, p4: Punto)

Hierarquia de classes

Algumas representações gráficas de árvores

•Grafo

•Conjuntos aninhados

•Parênteses aninhados

•Indentación

Grafo

A

B C

ED HGF

I LKJ O M N P

Conjuntos aninhados

A

B

C

E

K

J

L

G

F H

P

M N

OD

I

Parênteses aninhados

(A,

(B, (D, (I)),(E, (J),(K),(L))),

(C, (F, (O)),(G, (M),(N)),(H, (P)))

)

Indentación

A B

D

IE

J

KL

C

FO

G

MN

H

P

Definições de Árvore

Definição de Árvore segundo a teoria de grafo

Uma árvore é um grafo conexo, nãodirigido e acíclico.

Grafo com ciclo

NÃO é uma árvore

Árvore (Grafo conexo, não dirigido e acíclico)

Definição recursiva de árvore

(Horowitz, Capítulo 5)

Uma árvore T é um conjunto de elementos (que denominaremos nós), finito e não vazio, que cumpre:• Existe um nó especial r denominado raiz

da árvore;•Os restantes nós estão particionados em n

(n≥0) subconjuntos disjuntosT1 , T2, …, Tn,

sendo a cada um deles, uma árvore.

À cada subconjunto disjunto Ti :

T1 , T2, …, Tn,

Chamar-lhe-emos em adiante-o subárvoreassociado à árvore T.

r

T1T2 Tn-1 Tn

•Da definição dada deduze-se que aárvore mínima está composto por umsozinho nó: a raiz.

Por exemplo Ta = {A} é uma árvoredeste tipo.

A

B

C

Quando há mais de um nó, após ter seleccionado araiz, os restantes nós são particionados emsubárvores.

Por exemplo Tb= {B,{C}} é uma árvore composta deuma raiz e do subárvore {C} que a sua vez está

composto por um sozinho nó.

Tb

TD = {D,{E, {F}}, {G, {H,{I}},{J,{K},{L}},{M}}}

é uma árvore já que consta de uma raiz D e dois conjuntos

{E, {F}}{G, {H,{I}},{J,{K},{L}},{M}}

ue a sua vez são árvores.JH

I

G

D

M

K L

F

Terminologia

Inicialmente introduziremos os conceitos de:

• Pai (Padre)

• Filho (Hijo)• Irmão (Hermano)

• Grau (Grado)

• Folha (Hoja)

Pai: À raiz r da árvore T denomina-se-lhe pai de todas asraízes ri dos subárvores Ti de T.

Por exemplo:• D é pai de E e G

• G é pai de H, J e M

• K não é pai de

nenhum nó

JH

I

G

D

M

K L

F

Filho: A cada raiz ri do subárvore Ti da árvore T de raiz ré denominado filho de r.

Por exemplo:

• E e G são filhos de D

• H, J e M são filhos de G

• D não é filho de nenhum nóJH

I

G

D

M

K L

F

Irmãos: Duas raízes ri e rj de duas subárvoresdiferentes Ti e Tj da árvore T são denominados irmãos

T• E e G são irmãos(pois são as raízes de filhos de T)

• H, J e M são irmãos(pois são as raízes de filhos de G

em TG)

• F não tem irmãos

TG

JH

I

G

D

M

K L

F

Grau de um nó é o número de subárvores associadoscom o nó. O grau da árvore é o grau da raiz

Por exemplo o grau de:

-a raiz D da árvore T é 2-do nó G é 3-grau da árvore é 2

JH

I

G

D

M

K L

F

Folha: Os nós de grau zero (não têm subárvoresassociados) são denominados folhas.

Por exemplo são folhas

os nós F, I, K, L e M.

JH

I

G

D

M

K L

F

Outras terminologias

Definição de camino: Dado uma árvoreT um caminho é uma sucessão nãovazia r1,. . . , rn de nós de T, quecumpre que para 1≤ i <n tem-se queri é pai de ri+1 .

A longitude de um caminho é o númerode nós do caminho menos 1

As seguintes sucessões de nós:G,H,ID,E,FD,G,J,Ksão caminos

D,E,H não é caminho. JH

I

G

D

M

K L

F

As seguintes sucessões de nós:G,H,I (longitude 2)D,E,F (longitude 2)D,G,J,K (longitud 3)são caminos

D,E,H não é caminho. JH

I

G

D

M

K L

F

Baseados no conceito de caminho se define: •O nível ou profundidade de um nó•O peso ou altura de um nó•O peso ou altura de uma árvore• Ancestro. Ancestro próprio•Descendente. Descendente próprio

O nível ou profundidade de um nó ri

de T é a longitude do único caminhoda raiz r ao nó ri.

Por exemplo:

•o nível de D é 0

•o nível de J é 2

•o nível de K é 3 JH

I

G

D

M

K L

F

O nível ou profundidade de um nó ri deT pode-se definir também pelaseguinte expressão recursiva:

0 Se ri é a raiz

Nível(ri) =

Nível(rp)+1 Se rp é pai de ri

O peso ou altura de um nó ri de T é a longitude do maior caminho de ri às folhasO peso de uma árvore é o peso da raizPor exemplo o peso de

G é 2M é 0D é 3

E o peso da árvore é 3já que o peso da raiz é 3

JH

I

G

D

M

K L

F

O peso ou altura de um nó ri de Tpode-se definir também pela seguinteexpressão recursiva:

0 Se ri é uma folha

Peso(ri) =

Max(Peso(rj)) + 1 onde rj são

todos os filhos de ri

Um nó rp é ancestro de rq se existe um caminho de rp a rq.

Se a longitude do caminho

de rp a rq é 1 diz-se

que rp é um ancestro

próprio de rq. • D ancestro de E e F

• G ancestro de K

• J ancestro próprio de KJH

I

G

D

M

K L

F

Um nó rp é descendente de rq e existe umcaminho de rq a rp.

Se a longitude do caminho de rq a rp é 1 diz-se que rp é

um descendente próprio

de rq.E descendente de DK descendente de GK descendente próprio de J

JH

I

G

D

M

K L

F

Percorridos

Lista: Utilizando o índice i-ésimo da cada elemento.

Pilha: Acedendo na cada iteração ao topo da pilha.

Fila: Acedendo na cada iteração à frente da fila.

¿Como o faço nas estruturas de dados lineares?

Essencialmente existem doisenfoques diferentes para visitartodos os nós de uma árvore:• percorrido em profundidade

• percorrido na largura.

Percorridos em profundidade

Os percorridos de uma árvore emprofundidade podem serrealizados de três formas:• percorrido em preorden• percorrido em entreorden• percorrido em postorden

O percurso em preorden de umaárvore ( com mais de um nó) estáformado pela lista de nós que seobtém da seguinte forma:

1. Visitando a raiz da árvore2. Percorrendo em preorden a cada um dos subárvores da raiz.

A lista de um dos percorridos empreorden dos nós da árvore é:

D,E,F,G,H,I,J,K,L,M

JH

I

G

D

M

K L

F

O percorrido em entreorden de umaárvore ( com mais de um nó) está formadopela lista de nós que se obtém da seguinteforma :

1. Percorrendo em entreorden um dossubárvores da raiz

2. Visitando a raiz da árvore3. Percorrendo em entreorden a cada um

dos restantes subárvores da raiz

A lista de um dos percorridos ementreorden dos nós da árvore é:

F,E,D,I,H,G,K,J,L,M

JH

I

G

D

M

K L

F

O percorrido em postorden de uma árvore ( com mais de um nó) está formado pela lista de nós que se obtém da seguinte forma:

1. Percorrendo em postorden a cada um dos subárvores da raiz

2. Visitando a raiz da árvore

A lista de um dos percorridos empostorden dos nós da árvore é:

F,E,I,H,K,L,J,M,G,D

JH

I

G

D

M

K L

F

Algoritmo para percorrido em Preorden

Lista PercorridoEmPreorden ()

Criar lista

Preorden(lista)

retornar lista

fim // PercorridoEmPreorden

Algoritmo para percorrido em Preorden

Preorden (Lista L )

L.Adicionar(raiz)

Desde i = 0 Até grau-1 Com Passo 1 Fazer

Subárvore[i].Preorden (L)

fim // Preorden

/* note que para grau = 0 nunca se executa o ciclo*/

Tarefa

Estudar percorridos em profundidade em Epígrafe 3.1

do Aho e desenhar em seucódigo os algoritmos Entreorden e Postorden

Percorrido na largura

O percorrido na largura deuma árvore lista os nós naordem de níveis ouprofundidade na árvore.

No percorrido na largura visita-se o nó do nível 0 (isto é a raiz), aseguir todos os nós do nível 1,depois todos os nós do nível 2 eassim sucessivamente.

O percorrido

na largura

da árvore

Tc é:

D, E, G, F, H, J, M, I, K, L

JH

I

G

D

M

K L

F

Algoritmo para Percorrido na largura

Lista Na_Largura( )

Criar L

Criar FilaAux

FilaAux.Adicionar(arvore)

Enquanto ! FilaAux.Vazia()

arvoreActual = FilaAux.Extrair()

L.Adicionar(arvoreActual.Raiz())

Desde i=0 Até arvoreActual.Grau()-1 Com Passo 1 Fazer

FilaAux.Adicionar(arvoreActual.Subarvore[i])

FIm // Enquanto

retornar L

FIM // Na_Largura

•Realizar o percorridos nasdiferentes ordens dadas dasárvores descritas na classe.

Tarefa

O TDA árvore

Operações

• Raíz() Retorna o objeto contidona raiz da árvore.

• ÉFolha() Retorna True se aárvore é uma folha

• Grau() Retorna o Grau da árvore

•Altura() Retorna o peso ou altura daárvore

•Subarvore(i) Retorna uma cópia dei-esimo subárvore da árvore

•AdicionarSubarvore(Arvore)Adiciona uma árvore à lista desubárvores.

• PercorridoEmPreorden()• PercorridoEmEntreorden()• PercorridoEmPostorden()

Implementam os percorridos empreorden, entreorden e postordenda árvore.

• PercorridoNaLargura ()Implementa o percorrido na largurada árvore.

Estruturas de dados para a representação de árvores

ArvoreGeral

-raiz : T-subArvores : Lista <ArvoreGeral<T>>

+ ArvoreGeral(raiz: T) + Raiz() : T+ EFolha () : boolean+ Grau() : int+ Altura(): int+ SubArvore(pos: int) : ArvoreGeral<T>+ AdicionarSubArvore(n: ArvoreGeral<T>) + PreOrden() : Lista<T>+ PostOrden(): Lista<T>+ EntreOrden(): Lista<T>+ NaLargura(): Lista<T>

T

Conclusões

A árvore é uma estrutura de dadoscomplexa que deve ser estudadacom profundidade.

Conclusões

Sua terminologia é singela, masprecisa-se de um pensamentorecursivo para entendê-la melhor.

Conclusões

Os aplicativos desta estrutura de dados são muito amplas, daí a importância que tem a conhecer muito bem.

Tarefa

•Implementar o TDA Árvore usando a representação de lista de filhos..

top related