if969 - Árvores

33
Árvores Centro de Informá-ca Universidade Federal de Pernambuco Sistemas de Informação Vinicius Cardoso Garcia [email protected] © 2011 – Vinicius Cardoso Garcia

Upload: vinicius-cardoso-garcia

Post on 18-Sep-2014

268 views

Category:

Documents


3 download

DESCRIPTION

if969 - Árvores

TRANSCRIPT

Page 1: if969 - Árvores

Árvores  Centro  de  Informá-ca  Universidade  Federal  de  Pernambuco  Sistemas  de  Informação    Vinicius  Cardoso  Garcia  [email protected]  

©  2011  –  Vinicius  Cardoso  Garcia  

Page 2: if969 - Árvores

O  que  é  uma  árvore?  •  Na  ciência  da  computação,  

uma  árvore  é  um  modelo  abstrato  de  uma  estrutura  hierárquica  

•  Uma  árvore  consiste  de  nós  com  uma  relação  de  parentesco  

•  Aplicações:  –  Organiza-onal  charts  –  Sistemas  de  arquivos  –  Ambientes  de  programação  

Algoritmos  e  Estrutura  de  Dados  Árvores  ©  2011  –  Vinicius  Cardoso  Garcia  

2  

Computers”R”Us  

Sales   R&D  Manufacturing  

Laptops   Desktops  US   Interna-onal  

Europe   Asia   Canada  

Page 3: if969 - Árvores

Árvores  •  Vetores  e  Listas  são  ó-mos  para  representar  estrutura  de  dados  lineares,  mas  não  para  modelar  dados  hierárquicos  

•  Exemplos  de  dados  hierárquicos:  sistema  de  arquivos  de  um  computador  

•  Uma  árvore  é  uma  estrutura  de  dados  recursiva  que  permite  representar  dados  dispostos  de  maneira  hierárquica.  

Algoritmos  e  Estrutura  de  Dados  Árvores  ©  2011  –  Vinicius  Cardoso  Garcia  

3  

Page 4: if969 - Árvores

Definição  de  Árvore  •  Uma  árvore  écomposta  por  um  conjunto  de  nós    

•  Existe  um  nó  raiz  que  contém  zero  ou  mais  sub-­‐árvores,  cujas  raízes(nós  internos)  estão  ligadas  diretamente  àraiz.    

•  Os  nós  que  não  têm  filhos  são  chamados  de  folhas  (nós  externos)    

Algoritmos  e  Estrutura  de  Dados  Árvores  ©  2011  –  Vinicius  Cardoso  Garcia  

4  

Page 5: if969 - Árvores

Definição  de  Árvore  •  Ou  seja,  uma  árvore  é  uma  coleção  de  n  ≥  0  nós,  onde  – Se  n=0,  a  árvore  é  dita  nula  – Se  n  >  0,  a  árvore  tem  as  seguintes  caracterís-cas:  

•  O  nó  inicial  é  chamado  de  raiz  (root)  •  Os  demais  nós  são  par-cionados  em  T1,  T2,  ...,  Tk  estruturas  disjuntas  de  árvores  •  As  estruturas  T1,  T2,  ...,  Tk  denominam-­‐se  sub-­‐  árvores  

Algoritmos  e  Estrutura  de  Dados  Árvores  ©  2011  –  Vinicius  Cardoso  Garcia  

5  

Page 6: if969 - Árvores

Exemplo  de  Árvore  •  Sistema  de  arquivos  

Algoritmos  e  Estrutura  de  Dados  Árvores  ©  2011  –  Vinicius  Cardoso  Garcia  

6  

C:\  

Meus  Documentos  

Minhas  Imagens  

Minhas  Músicas  

Imagem.png  

Arquivos  de  Programas  

Java  

Page 7: if969 - Árvores

Exemplo  de  Árvore  •  Sistema  de  arquivos  

Algoritmos  e  Estrutura  de  Dados  Árvores  ©  2011  –  Vinicius  Cardoso  Garcia  

7  

C:\  

Meus  Documentos  

Minhas  Imagens  

Minhas  Músicas  

Imagem.png  

Arquivos  de  Programas  

Java  

Sub-­‐árvore  

Page 8: if969 - Árvores

Exemplo  de  Árvore  •  Sistema  de  arquivos  

Algoritmos  e  Estrutura  de  Dados  Árvores  ©  2011  –  Vinicius  Cardoso  Garcia  

8  

C:\  

Meus  Documentos  

Minhas  Imagens  

Minhas  Músicas  

Imagem.png  

Arquivos  de  Programas  

Java  

Sub-­‐árvore  Raiz   Raiz  de    

Sub-­‐árvore  

Folha  

Page 9: if969 - Árvores

Algoritmos  e  Estrutura  de  Dados  Árvores  ©  2011  –  Vinicius  Cardoso  Garcia  

9  

subtree  

Terminologia  

•  Root:  node  without  parent  (A)  •  Internal  node:  node  with  at  least  one  

child  (A,  B,  C,  F)  •  External  node  (a.k.a.  leaf  ):  node  

without  children  (E,  I,  J,  K,  G,  H,  D)  •  Ancestors  of  a  node:  parent,  

grandparent,  grand-­‐grandparent,  etc.  •  Depth  of  a  node:  number  of  ancestors  •  Height  of  a  tree:  maximum  depth  of  

any  node  (3)  •  Descendant  of  a  node:  child,  

grandchild,  grand-­‐grandchild,  etc.  

A  

B   D  C  

G   H  E   F  

I   J   K  

•  Subtree:  tree  consis-ng  of  a  node  and  its  descendants  

Page 10: if969 - Árvores

Profundidade  •  Profundidade  de  v  é  o  número  de  ancestrais  de  v  excluindo  o  próprio  

Algoritmos  e  Estrutura  de  Dados  Árvores  ©  2011  –  Vinicius  Cardoso  Garcia  

10  

Algoritmo  depth(T,  v);      se  v  é  a  raiz  de  T  então          retorne  0      senão          retorne  1  +  depth(T,  w),  onde  w  são  os  pais  de  v  em  T  

Page 11: if969 - Árvores

Altura  •  Se  v  é  um  nodo  externo,  então  a  altura  de  v  é  0  •  Em  qualquer  outro  caso,  a  altura  de  v  é  um  mais  a  altura  máxima  dos  

filhos  de  v  

Algoritmos  e  Estrutura  de  Dados  Árvores  ©  2011  –  Vinicius  Cardoso  Garcia  

11  

Algoritmo  altura1(T);      h  <-­‐  0      para  cada  vér-ce  v  em  T  faça          se  v  é  um  nodo  externo  de  T  então              h  <-­‐  Max(h,  depth(T,  v))      retorne  h  

Page 12: if969 - Árvores

Tipos  de  árvores  •  Árvores  binárias    – Cada  nó  tem  no  máximo  dois  filhos    

•  Árvore  com  número  variável  de  filhos    – Cada  nó  pode  ter  vários  filhos  

Algoritmos  e  Estrutura  de  Dados  Árvores  ©  2011  –  Vinicius  Cardoso  Garcia  

12  

Page 13: if969 - Árvores

Árvores  binárias  

•  É  uma  árvores  com  as  seguintes  propriedades  –  Cada  nó  interno  possui  ao  menos  dois  filhos  (exatamente)  

–  Um  filho  de  um  nó  é  um  par  ordenado  •  Filho  a  direita  e  a  esquerda  

•  Aplicações  –  Expressões  aritmé-cas  –  Processos  decisórios  –  Busca  

Algoritmos  e  Estrutura  de  Dados  Árvores  ©  2011  –  Vinicius  Cardoso  Garcia  

13  

A  

B   C  

F   G  D   E  

H   I  

Page 14: if969 - Árvores

14  

Árvores  para  Expressão  AritméJca  

•  Árvores  binárias  associada  a  uma  expressão  aritmé-ca  –  Nodos  internos:  operadores  –  Nodos  externos:  operandos  

•  Exemplo:  árvore  de  expressão  aritmé-ca  para  expressão  (2  × (a  -  1)  +  (3  × b))  

+

× ×

- 2  

a   1  

3   b  

Algoritmos  e  Estrutura  de  Dados  Árvores  ©  2011  –  Vinicius  Cardoso  Garcia  

Page 15: if969 - Árvores

15  

Árvore  de  Decisão  

•  Árvore  binária  associada  a  processos  decisórios  –  Nodos  internos:  questões  com  respostas  sim  ou  não  –  Nodos  externos:  decisões  

•  Exemplo:  decisão  de  jantar  

Want  a  fast  meal?  

How  about  coffee?   On  expense  account?  

Starbucks   Spike’s   Al  Forno   Café  Paragon  

Yes   No  

Yes   No   Yes   No  

Algoritmos  e  Estrutura  de  Dados  Árvores  ©  2011  –  Vinicius  Cardoso  Garcia  

Page 16: if969 - Árvores

16  

Propriedades  de  Árvores  Binárias  

•  Notação  n número  de  nodos  e número  de  nodos  

externos  i número  de  nodos  

internos  h altura  

" Propriedades:  n  e = i + 1 n  n = 2e - 1 n  h ≤ i n  h ≤ (n - 1)/2 n  e ≤ 2h

n  h ≥ log2 e n  h ≥ log2 (n + 1) - 1

Algoritmos  e  Estrutura  de  Dados  Árvores  ©  2011  –  Vinicius  Cardoso  Garcia  

Page 17: if969 - Árvores

Mais  observações  •  Se  uma  árvore  binária  con-ver  m  nós  no  nível  l,  então  no  nível  l+1  conterá  no  máximo  2m  nós  – Assim,  no  nível  l  uma  árvore  poderá  conter  no  máximo  2l  nós  

– Logo,  uma  árvore  binária  completa  de  profundidade  d  conterá  no  máximo  um  total  de  nós  (tn),  

Algoritmos  e  Estrutura  de  Dados  Árvores  ©  2011  –  Vinicius  Cardoso  Garcia  

17  

Mais Observações...

!Se uma árvore binária contiver m nós no nível l, então no nível l+1 conterá no máximo 2m nós" Assim, no nível l uma árvore poderá conter no

máximo 2l

" Logo, uma árvore binária completa de profundidade d conterá no máximo um total de nós (tn),

tn#20$2

1$2

2$%$2

d#&

j#0

d

2j

Page 18: if969 - Árvores

Mais  observações  •  Por  indução,  

– Assim,  também  é  possível  determinar  a  profundidade  da  árvore  binária  dado  a  quan-dade  de  nós  

Algoritmos  e  Estrutura  de  Dados  Árvores  ©  2011  –  Vinicius  Cardoso  Garcia  

18  

Mais Observações...

! Por indução,

" Assim, também é possível determinar a profundidade da árvore binária dado a quantidade de nós

20#2

0$1%1#1

20$2

1#2

1$1%1#3

20$2

1$2

2#2

2$1%1#7

&

'j#0

d

2j#2

d$1%1

Page 19: if969 - Árvores

Árvore  Completa  e  Quase-­‐Completa  •  Uma  árvore  binária  é  completa  quando  todos  os  pais  têm  dois  filhos  (esquerdo  e  direito)  

•  Uma  árvore  binária  é  quase  completa  quando:  – Cada  folha  da  árvore  es-ver  no  nível  d  ou  no  nível  d-­‐1  

– Para  cada  nó  nd  na  árvore  com  um  descendente  direito  no  nível  d,  todos  os  descendentes  esquerdos  de  nd  que  forem  folhas  es-verem  também  no  nível  d.  

Algoritmos  e  Estrutura  de  Dados  Árvores  ©  2011  –  Vinicius  Cardoso  Garcia  

19  

Page 20: if969 - Árvores

Representação  de  um  Nó  •  Um  nodo  para  uma  árvore  binária  deve  conter:    – Um  campo  DADOS  – Um  ponteiro  para  o  Nó  Filho  ESQUERDO  – Um  ponteiro  para  o  Nó  Filho  DIREITO  – Um  ponteiro  para  o  Nó  PAI  

Algoritmos  e  Estrutura  de  Dados  Árvores  ©  2011  –  Vinicius  Cardoso  Garcia  

20  

Representação de um Nodo! Um nodo para uma árvore binária deve conter:

" Um campo DADOS

" Um ponteiro para o Nodo Filho ESQUERDO

" Um ponteiro para o Nodo Filho DIREITO

" Um ponteiro para o Nodo PAI

esq dirpaidados

nodo

Page 21: if969 - Árvores

Operações  Básicas  •  Existem  várias  operações  possíveis  com  árvores  binárias,  

porém  as  mais  comuns  são:  –  info(p):  retorna  o  conteúdo  do  nó  p  –  esquerdo(p)  ou  le�(p):  retorna  o  filho  esquerdo  de  p  ou  None  caso  não  exista  filho  esquerdo  

–  direito(p)  ou  right(p):  retorna  o  filho  direito  de  p  ou  None  caso  não  exista  filho  direito  

–  pai(p)  ou  father(p):  retorna  o  pai  de  p  ou  None  caso  não  exista  pai    

–  irmao(p)  ou  brother(p):  retorna  o  irmão  de  p  ou  None  caso  não  exista  irmão  

–  ehEsquerdo(p)  ou  isle�(p):  retorna  TRUE  se  p  é  filho  esquerdo  do  seu  pai  e  FALSE  caso  contrário  

–  ehDireito(p)  ou  isright(p):  retorna  TRUE  se  p  é  filho  direito  do  seu  pai  e  FALSE  caso  contrário  

Algoritmos  e  Estrutura  de  Dados  Árvores  ©  2011  –  Vinicius  Cardoso  Garcia  

21  

Page 22: if969 - Árvores

Operações  Básicas  •  As  funções  para  retorno  de  filhos  esquerdo  e  direito,  pai  e  conteúdo  são  triviais:  – def  getInfo(p):  return  self.dado  – def  getLe�(p):  return  self.esq  – def  getRight(p):  return  self.dir  – def  getFather(p):  return  self.pai  

•  Onde  p  é  um  ponteiro  para  um  nó  da  árvore!  

•  Mas,  e  as  demais  funções,  como  implementá-­‐  las?  

Algoritmos  e  Estrutura  de  Dados  Árvores  ©  2011  –  Vinicius  Cardoso  Garcia  

22  

Page 23: if969 - Árvores

Operações  Básicas  •  U-lizando  as  funções  getLe�(p),  getRight(p)  e  getFather(p)  é  possível  escrever  as  demais  funções:  – Função  isle�(p):  é  filho  esquerdo?  

Algoritmos  e  Estrutura  de  Dados  Árvores  ©  2011  –  Vinicius  Cardoso  Garcia  

23  

... !q = getFather(p) !if q == none:! return false; #quando p aponta para raiz if getLeft(q)==p:! return true !return false!

Page 24: if969 - Árvores

Operações  Básicas  •  Função  isright(p):  é  filho  direito?  

Algoritmos  e  Estrutura  de  Dados  Árvores  ©  2011  –  Vinicius  Cardoso  Garcia  

24  

...!q = getFather(p) !if q == null:! return false #quando p aponta para raiz!if getRight(q)==p: ! return true!return false!

Page 25: if969 - Árvores

Operações  Básicas  •  Função  brother(p):  retorna  irmão  de  p  

Algoritmos  e  Estrutura  de  Dados  Árvores  ©  2011  –  Vinicius  Cardoso  Garcia  

25  

...!if getFather(p) == null:!return false #quando p aponta para raiz!if isleft(p): ! return getRight(getFather(p))!return getLeft(getFather(p))!

Page 26: if969 - Árvores

Exercício  de  fixação  •  Ao  ler  o  primeiro  número  da  lista,  crie  uma  árvore  binária:  – Este  número  é  o  nó  raiz  

•  Ao  ler  o  segundo  número  da  lista,  compare  com  a  árvore,  – Se  for  igual  ao  nó  atual,  temos  uma  repe-ção;  – Se  for  maior  que  o  nó  atual,  vá  para  o  filho  direito  e  repita  a  comparação;  

– Se  for  menor  que  o  nó  atual,  vá  para  o  filho  da  esquerda  e  repita  a  comparação  

Algoritmos  e  Estrutura  de  Dados  Árvores  ©  2011  –  Vinicius  Cardoso  Garcia  

26  

Page 27: if969 - Árvores

Percorrendo  uma  Árvore  •  Operação  de  percorrer  uma  árvore:  – É  o  ato  de  caminhar  sobre  a  árvore  enumerando  cada  um  dos  seus  nós  uma  vez  •  É  dito  visitar  um  nó  a  medida  que  ele  é  enumerado  •  Não  existe  uma  ordem  natural  para  se  visitar  os  nós  de  uma  árvore!  É  possível  citar  três  métodos:  –  Pré-­‐ordem  ou  profundidade  ou  caminhamento  pré-­‐fixado  –  Em  ordem  ou  ordem  simétrica  ou  caminhamento  inter-­‐fixado  –  Pós-­‐ordem  ou  caminhamento  pós-­‐fixado  

Algoritmos  e  Estrutura  de  Dados  Árvores  ©  2011  –  Vinicius  Cardoso  Garcia  

27  

Page 28: if969 - Árvores

Caminhamento  pré-­‐fixado  •  Caminhamento  é  a  visita  aos  nós  de  uma  

árvore  de  maneira  sistemá-ca  •  No  caminhamento  pré-­‐fixado,  um  nó  é  

visitado  antes  dos  seus  decendentes    •  Aplicação:  imprimir  a  estrutura  de  um  

documento  

Algoritmos  e  Estrutura  de  Dados  Árvores  ©  2011  –  Vinicius  Cardoso  Garcia  

28  

Make  Money  Fast!  

1.  Mo-va-ons   2.  Methods  

2.1  Stock  Fraud  

2.2  Ponzi  Scheme  1.1  Greed   1.2  Avidity  

1  

2  

3  

5  

4   6   7  

Algoritmo preOrder(v) visit(v) for each child w of v

preorder (w)

Page 29: if969 - Árvores

Caminhamento  pós-­‐fixado  •  No  caminhamento  pós-­‐fixado,  o  nó  

e  visitado  após  os  seus  decendentes  •  Aplicação:  calcular  o  espaço  

ocupado  por  arquivos  em  um  diretório  e  subdiretórios  

Algoritmos  e  Estrutura  de  Dados  Árvores  ©  2011  –  Vinicius  Cardoso  Garcia  

29  

cs16/  

homeworks/   programs/  

DDR.java  10K  

Stocks.java  25K  

h1c.doc  3K  

h1nc.doc  2K  

7  

3  

1  

6  

2   4   5  

Algoritmo postOrder(v) for each child w of v

postOrder (w) visit(v)

Page 30: if969 - Árvores

30  

Caminhamento  interfixado  •  Em  um  caminhamento  

interfixado  um  nó  é  visitado  após  a  sua  sub-­‐árvore  a  esquerda  e  antes  da  sua  sub-­‐árvore  direita  

•  Aplicação:  desenhe  uma  árvore  binária  –  x(v)  =  inorder  rank  of  v  –  y(v)  =  depth  of  v  

Algoritmo inOrder(v) if hasLeft (v)

inOrder (left (v)) visit(v) if hasRight (v)

inOrder (right (v))

3  

1  

2  

5  

6  

7   9  

8  

4  

Algoritmos  e  Estrutura  de  Dados  Árvores  ©  2011  –  Vinicius  Cardoso  Garcia  

Page 31: if969 - Árvores

31  

•  Especialização  do  caminhamento  interfixado  –  Imprime  operando  ou  operador  

quando  visita  o  nó  –  imprime  “(“  antes  de  caminhar  

na  subárvore  esquerda  –  imprime  “)“  após  caminhar  na  

sub-­‐árvore  direita  

Algorithm printExpression(v) if hasLeft (v)

print(“(’’) inOrder (left(v))

print(v.element ()) if hasRight (v)

inOrder (right(v)) print (“)’’) +

× ×

- 2  

a   1  

3   b  ((2  × (a  -  1))  +  (3  × b))  

Impressão  de  Expressões  AritméJcas  

Algoritmos  e  Estrutura  de  Dados  Árvores  ©  2011  –  Vinicius  Cardoso  Garcia  

Page 32: if969 - Árvores

32  

•  Especialização  do  caminhamento  pós-­‐fixado  –  Método  recursivo  retornando  

o  valor  da  sub-­‐árvore  –  Quando  visitar  um  nó  interno,  

combine  o  valor  das  sub-­‐árvores  

Algorithm evalExpr(v) if isExternal (v)

return v.element () else

x ← evalExpr(leftChild (v)) y ← evalExpr(rightChild (v)) ◊ ← operator stored at v return x ◊ y

+

× ×

- 2  

5   1  

3   2  

Avaliando  Expressões  AritméJcas  

Algoritmos  e  Estrutura  de  Dados  Árvores  ©  2011  –  Vinicius  Cardoso  Garcia  

Page 33: if969 - Árvores

AJvidades  Complementares  •  Leitura  da  seção  10.4  do  livro  do  Cormen  

•  Implemente  uma  classe  árvore  binária  

•  Implemente  a  aplicação  proposta  para  avaliação  de  expressões  aritmé-cas  – Considere  o  uso  de  parênteses  

Algoritmos  e  Estrutura  de  Dados  Árvores  ©  2011  –  Vinicius  Cardoso  Garcia  

33