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

106
Computação III Professor: Mtr. David Batard Lorenzo Instituto Superior para as Tecnologias de Informção e Telecomunicação ISUTIC

Upload: others

Post on 07-Jul-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

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

ISUTIC

Page 2: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 3: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Estruturas de dados no lineares

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

Page 4: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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.

Page 5: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Objectivos

• Caracterizar o funcionamento dos algoritmos recursivos.

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

Page 6: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Lembrete:

Estrutura de dados

• Coleção de variáveis,

• relacionados de alguma forma

• que definiu um conjunto de operações

• que satisfaçam determinadaspropriedades.

Page 7: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Lembrete

Tipo de Dado Abstrato

• Modelo matemático

• consiste em um conjunto de dados

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

Page 8: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Lembrete

Tipo de Dado Abstrato

TDA

Estrutura de Dados

Operações

Page 9: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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.

Page 10: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Exemplos de conceitos recursivos

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

- Um ramo de uma árvore tem ramos…

Page 11: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Exemplos de conceitos recursivos

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

Page 12: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Exemplos de conceitos recursivos

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

Page 13: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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)

Page 14: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 15: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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.

Page 16: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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)

Page 17: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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.

Page 18: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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.

Page 19: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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.

Page 20: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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);

}

Page 21: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

¿Como funciona um método recursivo?

Page 22: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

public static void main(String []args){

int x = 3;

int fac = factorial(x);

}

Page 23: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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);}

Page 24: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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);

Page 25: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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);

Page 26: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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;

Page 27: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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;

Page 28: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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;

Page 29: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

public static void main(){

int x = 3;

int fac = factorial(x);

factorial(3){

if (3==0) return 1;

return 3*2;

Page 30: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

public static void main(String []args){

int x = 3;

int fac = 6;

}

Page 31: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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.

Page 32: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 33: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 34: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 35: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

… …

… …

… …

Page 36: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Outros exemplos de árvores

Page 37: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Índice de um livro

Page 38: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Árvore genealógico

Page 39: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Sistema de arquivos Unix

Page 40: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 41: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Algumas representações gráficas de árvores

•Grafo

•Conjuntos aninhados

•Parênteses aninhados

•Indentación

Page 42: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Grafo

A

B C

ED HGF

I LKJ O M N P

Page 43: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Conjuntos aninhados

A

B

C

E

K

J

L

G

F H

P

M N

OD

I

Page 44: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Parênteses aninhados

(A,

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

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

)

Page 45: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Indentación

A B

D

IE

J

KL

C

FO

G

MN

H

P

Page 46: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Definições de Árvore

Page 47: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

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

Page 48: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Grafo com ciclo

NÃO é uma árvore

Page 49: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 50: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Definição recursiva de árvore

(Horowitz, Capítulo 5)

Page 51: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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.

Page 52: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

À cada subconjunto disjunto Ti :

T1 , T2, …, Tn,

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

Page 53: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

r

T1T2 Tn-1 Tn

Page 54: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

•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

Page 55: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 56: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 57: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Terminologia

Page 58: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Inicialmente introduziremos os conceitos de:

• Pai (Padre)

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

• Grau (Grado)

• Folha (Hoja)

Page 59: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 60: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 61: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 62: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 63: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 64: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Outras terminologias

Page 65: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 66: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 67: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 68: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 69: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 70: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 71: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 72: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 73: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 74: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 75: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Percorridos

Page 76: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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?

Page 77: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

• percorrido na largura.

Page 78: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Percorridos em profundidade

Page 79: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 80: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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.

Page 81: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 82: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 83: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 84: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 85: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 86: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Algoritmo para percorrido em Preorden

Lista PercorridoEmPreorden ()

Criar lista

Preorden(lista)

retornar lista

fim // PercorridoEmPreorden

Page 87: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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*/

Page 88: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Tarefa

Estudar percorridos em profundidade em Epígrafe 3.1

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

Page 89: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Percorrido na largura

Page 90: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 91: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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.

Page 92: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 93: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 94: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Tarefa

Page 95: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

O TDA árvore

Page 96: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Operações

Page 97: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

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

• Grau() Retorna o Grau da árvore

Page 98: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

•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.

Page 99: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Implementam os percorridos empreorden, entreorden e postordenda árvore.

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

Page 100: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 101: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

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

Page 102: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Conclusões

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

Page 103: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Conclusões

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

Page 104: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Conclusões

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

Page 105: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer

Tarefa

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

Page 106: Computação IIIAnteriormente tinha-se estudado as estruturas de dados lineares (listas, pilhas, filas). Nas que a cada elemento tinha um elemento diante e outro detrás e para o percorrer