A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

UNIVERSIDADE FEDERAL DE MINAS GERAIS Árvores Cristiano Arbex Valle Vinicius Fernandes dos Santos

Apresentações semelhantes


Apresentação em tema: "UNIVERSIDADE FEDERAL DE MINAS GERAIS Árvores Cristiano Arbex Valle Vinicius Fernandes dos Santos"— Transcrição da apresentação:

1 UNIVERSIDADE FEDERAL DE MINAS GERAIS Árvores Cristiano Arbex Valle arbex@dcc.ufmg.br Vinicius Fernandes dos Santos viniciussantos@dcc.ufmg.br

2 COMPUTER SCIENCE Árvores Organizam dados de forma hierárquica – Acontecem com frequência na natureza Fáceis de representar e manipular com computadores – Úteis para várias tarefas

3 COMPUTER SCIENCE Exemplos Árvores de decisão (inteligência artificial) Possibilidade de jogar tênis hoje:

4 COMPUTER SCIENCE Exemplos Árvore de Huffman (compressão de dados) – “this is an example of a huffman tree” # ' 7 a4 e4 f3 h2 i2 m2 n2 s2 t2 l1 o1 p1 r1 u1 x1 ASCII dec 32 97 101 102 104 105 109 110 115 116 108 111 112 114 117 120 binbits 001000008 011000018 011001018 011001108 011010008 011010018 011011018 011011108 011100118 011101008 011011008 011011118 011100008 011100108 011101018 011110008 total 56 32 24 16 8 8 8 8 8 8

5 COMPUTER SCIENCE Exemplos Árvore de Huffman (compressão de dados) – “this is an example of a huffman tree” # ' 7 a4 e4 f3 h2 i2 m2 n2 s2 t2 l1 o1 p1 r1 u1 x1 ASCII dec 32 97 101 102 104 105 109 110 115 116 108 111 112 114 117 120 binbits 001000008 011000018 011001018 011001108 011010008 011010018 011011018 011011108 011100118 011101008 011011008 011011118 011100008 011100108 011101018 011110008 total 56 32 24 16 8 8 8 8 8 8 288 bits

6 COMPUTER SCIENCE Exemplos Árvore de Huffman (compressão de dados) 10 1 0 0 0 1 0 10 101110 101001010 10110 Exemplos: a = 010 x = 10010

7 COMPUTER SCIENCE Exemplos Árvore de Huffman (compressão de dados) – “this is an example of a huffman tree” # ' 7 a4 e4 f3 h2 i2 m2 n2 s2 t2 l1 o1 p1 r1 u1 x1 ASCII dec 32 97 101 102 104 105 109 110 115 116 108 111 112 114 117 120 binbits 001000008 011000018 011001018 011001108 011010008 011010018 011011018 011011108 011100118 011101008 011011008 011011118 011100008 011100108 011101018 011110008 total 56 32 24 16 8 8 8 8 8 8 HUFFMAN bin 111 010 000 1101 1010 1000 0111 0010 1011 0110 11001 00110 10011 11000 00111 10010 total 21 12 8 8 8 8 8 8 5 5 5 5 5 5 288 bits bits 3 3 3 4 4 4 4 4 4 4 5 5 5 5 5 5

8 COMPUTER SCIENCE Exemplos Árvore de Huffman (compressão de dados) – “this is an example of a huffman tree” # ' 7 a4 e4 f3 h2 i2 m2 n2 s2 t2 l1 o1 p1 r1 u1 x1 ASCII dec 32 97 101 102 104 105 109 110 115 116 108 111 112 114 117 120 binbits 001000008 011000018 011001018 011001108 011010008 011010018 011011018 011011108 011100118 011101008 011011008 011011118 011100008 011100108 011101018 011110008 total 56 32 24 16 8 8 8 8 8 8 HUFFMAN binbits 1113 0103 0003 11014 10104 10004 01114 00104 10114 01104 110015 001105 100115 110005 001115 100105 total 21 12 8 8 8 8 8 8 5 5 5 5 5 5 288 bits135 bits

9 COMPUTER SCIENCE Árvores em AEDS2 Árvores digitais (tries)Árvore binária de busca (ABB)

10 COMPUTER SCIENCE Terminologia

11 COMPUTER SCIENCE Raiz Terminologia

12 COMPUTER SCIENCE Folhas Terminologia

13 COMPUTER SCIENCE Vértices internos Terminologia

14 COMPUTER SCIENCE Filhos Pai Terminologia

15 COMPUTER SCIENCE Descendentes Terminologia

16 COMPUTER SCIENCE Ancestrais Terminologia

17 COMPUTER SCIENCE Irmãos Terminologia

18 COMPUTER SCIENCE Níveis 0 1 2 3 4 Terminologia

19 COMPUTER SCIENCE Caminho Terminologia

20 COMPUTER SCIENCE TAD árvore binária Cada vértice tem no máximo dois filhos – (obs: a árvore ao lado não impõe nenhuma ordenação dos vértices) Operações – Inserção – Remoção – Caminhamento

21 COMPUTER SCIENCE Árvore binária: Impl. com Arranjos Filhos de i – Esquerda: 2i + 1 – Direita: 2i + 2 Pai de i:

22 COMPUTER SCIENCE Árvore binária: Impl. com Arranjos Vantagens – Representação compacta – Localidade de referência Desvantagens – Desperdício de espaço em árvores incompletas – Inserção e remoção podem exigir deslocamentos

23 COMPUTER SCIENCE Árvore binária: Impl. com Apontadores typedef int TChave; typedef struct { TChave Chave; // outros componentes } TItem; typedef struct Vertice { TItem Item; Apontador Esq, Dir; } TVertice; typedef struct Vertice * Apontador; typedef Apontador TArvore;

24 COMPUTER SCIENCE TAD árvore binária de busca (ABB) Cada vértice tem no máximo dois filhos – (obs: a árvore ao lado impõe uma ordenação particular aos vértices) R ED R ED <<

25 COMPUTER SCIENCE TAD árvore binária de busca (ABB) Cada vértice tem no máximo dois filhos – (obs: a árvore ao lado impõe uma ordenação particular aos nodos) Operações – Inserção – Remoção – Caminhamento – Pesquisa – Ordenação

26 COMPUTER SCIENCE ABB: inserção void Insere(TItem x, Apontador *p) – Observação: p passado por referência (endereço contido em *p vai ser alterado dentro de Insere ) – Ideia: a partir do vértice apontado por *p, podemos encontrar o ponto de inserção para o registro x *p é nulo? – Ponto de inserção! x < registro atual? – Caminhamos para a esquerda x > registro atual? – Caminhamos para a direita x == registro atual? – Vértice já existe

27 COMPUTER SCIENCE ABB: inserção TArvore a; // Apontador TItem x; x.Chave = 8; Insere(x, &a); *p

28 COMPUTER SCIENCE ABB: inserção TArvore a; // Apontador TItem x; x.Chave = 8; Insere(x, &a); *p 8

29 COMPUTER SCIENCE ABB: inserção TArvore a; // Apontador... // várias inserções TItem x; x.Chave = 4; Insere(x, &a); *p 1 3 14 8 10 6 713

30 COMPUTER SCIENCE ABB: inserção TArvore a; // Apontador... // várias inserções TItem x; x.Chave = 4; Insere(x, &a); *p 1 3 14 8 10 6 713

31 COMPUTER SCIENCE ABB: inserção TArvore a; // Apontador... // várias inserções TItem x; x.Chave = 4; Insere(x, &a); *p 1 3 14 8 10 6 713

32 COMPUTER SCIENCE ABB: inserção TArvore a; // Apontador... // várias inserções TItem x; x.Chave = 4; Insere(x, &a); 1 3 14 8 10 6 713 *p

33 COMPUTER SCIENCE ABB: inserção TArvore a; // Apontador... // várias inserções TItem x; x.Chave = 4; Insere(x, &a); 1 3 14 8 10 6 713 *p

34 COMPUTER SCIENCE ABB: inserção TArvore a; // Apontador... // várias inserções TItem x; x.Chave = 4; Insere(x, &a); 1 3 14 8 10 6 713 *p 4

35 COMPUTER SCIENCE ABB: inserção void Insere(TItem x, Apontador *p) { if (*p == NULL) { *p = malloc(sizeof(TVertice)); (*p)->Item = x; (*p)->Esq = NULL; (*p)->Dir = NULL; } else if (x.Chave Item.Chave) Insere(x, &(*p)->Esq); else if (x.Chave > (*p)->Item.Chave) Insere(x, &(*p)->Dir); else printf("ERRO: Item já existe\n"); }

36 COMPUTER SCIENCE ABB: remoção void Retira(TItem x, Apontador *p) – Observação: p passado por referência (endereço contido em *p vai ser alterado dentro de Retira ) – Ideia: a partir do vértice apontado por *p, podemos encontrar o ponto de remoção para o registro x *p é nulo? – Nada a fazer x < registro atual? – Caminhamos para a esquerda x > registro atual? – Caminhamos para a direita x == registro atual? – Encontramos vértice a ser removido

37 COMPUTER SCIENCE ABB: remoção Como remover um vértice? – Tem zero filhos (i.e., vértice folha)? Simplesmente remova – Tem um filho? Substitua pelo filho – Tem dois filhos? Copie item do antecessor na sub-árvore esquerda (antecessor central) e remova o antecessor, ou Copie item do sucessor na sub-árvore direita (sucessor central) e remova sucessor

38 COMPUTER SCIENCE ABB: remoção (caso 1) TArvore a; // Apontador... // várias inserções TItem x; x.Chave = 4; Retira(x, &a); 1 3 14 8 10 6 713 *p 4

39 COMPUTER SCIENCE ABB: remoção (caso 1) TArvore a; // Apontador... // várias inserções TItem x; x.Chave = 4; Retira(x, &a); 1 3 14 8 10 6 713 *p

40 COMPUTER SCIENCE ABB: remoção (caso 2) TArvore a; // Apontador... // várias inserções TItem x; x.Chave = 14; Retira(x, &a); 1 3 14 8 10 6 713 *p 4

41 COMPUTER SCIENCE ABB: remoção (caso 2) TArvore a; // Apontador... // várias inserções TItem x; x.Chave = 14; Retira(x, &a); 1 3 13 8 10 6 7 *p 4

42 COMPUTER SCIENCE ABB: remoção (caso 3) TArvore a; // Apontador... // várias inserções TItem x; x.Chave = 8; Retira(x, &a); 1 3 14 8 10 6 713 *p 4

43 COMPUTER SCIENCE ABB: remoção (caso 3) TArvore a; // Apontador... // várias inserções TItem x; x.Chave = 8; Retira(x, &a); 1 3 14 8 10 6 713 *p 4 ant

44 COMPUTER SCIENCE ABB: remoção (caso 3) TArvore a; // Apontador... // várias inserções TItem x; x.Chave = 8; Retira(x, &a); 1 3 14 7 10 6 713 *p 4 ant

45 COMPUTER SCIENCE ABB: remoção (caso 3) TArvore a; // Apontador... // várias inserções TItem x; x.Chave = 8; Retira(x, &a); 1 3 14 7 10 6 13 *p 4 ant

46 COMPUTER SCIENCE ABB: remoção (caso 3) TArvore a; // Apontador... // várias inserções TItem x; x.Chave = 8; Retira(x, &a); 1 3 14 8 10 6 713 *p 4 suc

47 COMPUTER SCIENCE ABB: remoção (caso 3) TArvore a; // Apontador... // várias inserções TItem x; x.Chave = 8; Retira(x, &a); 1 3 14 10 6 713 *p 4 suc

48 COMPUTER SCIENCE ABB: remoção (caso 3) TArvore a; // Apontador... // várias inserções TItem x; x.Chave = 8; Retira(x, &a); 1 3 10 14 6 7 13 *p 4

49 COMPUTER SCIENCE ABB: remoção void Retira(TItem x, Apontador *p) { Apontador Aux; if (*p == NULL) printf("ERRO: Item não encontrado\n"); else if (x.Chave Item.Chave) Retira(x, &(*p)->Esq); else if (x.Chave > (*p)->Item.Chave) Retira(x, &(*p)->Dir);...

50 COMPUTER SCIENCE ABB: remoção... else if ((*p)->Dir == NULL) { Aux = *p; *p = (*p)->Esq; free(Aux); } else if ((*p)->Esq == NULL) { Aux = *p; *p = (*p)->Dir; free(Aux); } else if (rand() % 100 + 1 < 50) Antecessor(*p, &(*p)->Esq); else Sucessor(*p, &(*p)->Dir); } Caso 1 + Caso 2 Caso 3

51 COMPUTER SCIENCE ABB: remoção void Antecessor(Apontador q, Apontador *r) { if ((*r)->Dir != NULL) { Antecessor(q, &(*r)->Dir); return; } Apontador aux; q->Item = (*r)->Item; aux = *r; *r = (*r)->Esq; free(aux); }

52 COMPUTER SCIENCE ABB: remoção void Sucessor(Apontador q, Apontador *r) { if ((*r)->Esq != NULL) { Sucessor(q, &(*r)->Esq); return; } Apontador aux; q->Item = (*r)->Item; aux = *r; *r = (*r)->Dir; free(aux); }

53 COMPUTER SCIENCE Caminhamento Diversas formas de percorrer ou caminhar em uma árvore listando seus vértice, as principais: Pré-ordem (pré-fixada) Central (infixada) Pós-ordem (pós-fixada) Para todas elas: – Se T é uma árvore nula, então a lista é nula – Se T é uma árvore de um único vértice então a lista contém apenas este vértice

54 COMPUTER SCIENCE Caminhamento pré-ordem Ideia: – Imprime – Visita sub-árvore esquerda em pré-ordem – Visita sub-árvore direita em pré-ordem void PreOrdem(Apontador p) { if (p == null) return; printf("%d\n", p->Chave); PreOrdem(p->Esq); PreOrdem(p->Dir); }

55 COMPUTER SCIENCE 32 1 46 789 ABC 5 void PreOrdem(Apontador p) { if (p == null) return; printf("%d\n", p->Chave); PreOrdem(p->Esq); PreOrdem(p->Dir); } Caminhamento pré-ordem 1

56 COMPUTER SCIENCE 32 1 46 789 ABC 5 void PreOrdem(Apontador p) { if (p == null) return; printf("%d\n", p->Chave); PreOrdem(p->Esq); PreOrdem(p->Dir); } Caminhamento pré-ordem 1 2

57 COMPUTER SCIENCE 32 1 46 789 ABC 5 void PreOrdem(Apontador p) { if (p == null) return; printf("%d\n", p->Chave); PreOrdem(p->Esq); PreOrdem(p->Dir); } Caminhamento pré-ordem 1 2 4

58 COMPUTER SCIENCE 32 1 46 789 ABC 5 void PreOrdem(Apontador p) { if (p == null) return; printf("%d\n", p->Chave); PreOrdem(p->Esq); PreOrdem(p->Dir); } Caminhamento pré-ordem 1 2 4 7

59 COMPUTER SCIENCE 32 1 46 789 ABC 5 void PreOrdem(Apontador p) { if (p == null) return; printf("%d\n", p->Chave); PreOrdem(p->Esq); PreOrdem(p->Dir); } Caminhamento pré-ordem 1 2 4 7 A

60 COMPUTER SCIENCE 32 1 46 789 ABC 5 void PreOrdem(Apontador p) { if (p == null) return; printf("%d\n", p->Chave); PreOrdem(p->Esq); PreOrdem(p->Dir); } Caminhamento pré-ordem 1 2 4 7 A B

61 COMPUTER SCIENCE 32 1 46 789 ABC 5 void PreOrdem(Apontador p) { if (p == null) return; printf("%d\n", p->Chave); PreOrdem(p->Esq); PreOrdem(p->Dir); } Caminhamento pré-ordem 1 2 4 7 A B 3

62 COMPUTER SCIENCE 32 1 46 789 ABC 5 1 2 4 7 A B 3 5 6 8 C 9 void PreOrdem(Apontador p) { if (p == null) return; printf("%d\n", p->Chave); PreOrdem(p->Esq); PreOrdem(p->Dir); } Caminhamento pré-ordem

63 COMPUTER SCIENCE Caminhamento central Ideia: – Visita sub-árvore esquerda em pré-ordem – Imprime – Visita sub-árvore direita em pré-ordem void Central(Apontador p) { if (p == null) return; Central(p->Esq); printf("%d\n", p->Chave); Central(p->Dir); }

64 COMPUTER SCIENCE 32 1 46 789 ABC 5 Caminhamento central void Central(Apontador p) { if (p == null) return; Central(p->Esq); printf("%d\n", p->Chave); Central(p->Dir); } A

65 COMPUTER SCIENCE 32 1 46 789 ABC 5 Caminhamento central void Central(Apontador p) { if (p == null) return; Central(p->Esq); printf("%d\n", p->Chave); Central(p->Dir); } A 7

66 COMPUTER SCIENCE 32 1 46 789 ABC 5 Caminhamento central void Central(Apontador p) { if (p == null) return; Central(p->Esq); printf("%d\n", p->Chave); Central(p->Dir); } A 7 B

67 COMPUTER SCIENCE 32 1 46 789 ABC 5 Caminhamento central void Central(Apontador p) { if (p == null) return; Central(p->Esq); printf("%d\n", p->Chave); Central(p->Dir); } A 7 B 4

68 COMPUTER SCIENCE 32 1 46 789 ABC 5 Caminhamento central void Central(Apontador p) { if (p == null) return; Central(p->Esq); printf("%d\n", p->Chave); Central(p->Dir); } A 7 B 4 2 1 5 3 C 8 6 9

69 COMPUTER SCIENCE Caminhamento pós-ordem Idea: – Visita sub-árvore esquerda em pré-ordem – Visita sub-árvore direita em pré-ordem – Imprime void PosOrdem(Apontador p) { if (p == null) return; PosOrdem(p->Esq); PosOrdem(p->Dir); printf("%d\n", p->Chave); }

70 COMPUTER SCIENCE 32 1 46 789 ABC 5 2 1 4 7 A Caminhamento pós-ordem void PosOrdem(Apontador p) { if (p == null) return; PosOrdem(p->Esq); PosOrdem(p->Dir); printf("%d\n", p->Chave); } A

71 COMPUTER SCIENCE 32 1 46 78 ABC 5 9 Caminhamento pós-ordem void PosOrdem(Apontador p) { if (p == null) return; PosOrdem(p->Esq); PosOrdem(p->Dir); printf("%d\n", p->Chave); } A B

72 COMPUTER SCIENCE 32 1 46 78 ABC 5 9 Caminhamento pós-ordem void PosOrdem(Apontador p) { if (p == null) return; PosOrdem(p->Esq); PosOrdem(p->Dir); printf("%d\n", p->Chave); } A B 7

73 COMPUTER SCIENCE 32 1 46 78 ABC 5 9 Caminhamento pós-ordem void PosOrdem(Apontador p) { if (p == null) return; PosOrdem(p->Esq); PosOrdem(p->Dir); printf("%d\n", p->Chave); } A B 7 4

74 COMPUTER SCIENCE 32 1 46 78 ABC 5 9 Caminhamento pós-ordem void PosOrdem(Apontador p) { if (p == null) return; PosOrdem(p->Esq); PosOrdem(p->Dir); printf("%d\n", p->Chave); } A B 7 4 2

75 COMPUTER SCIENCE 32 1 46 78 ABC 5 9 Caminhamento pós-ordem void PosOrdem(Apontador p) { if (p == null) return; PosOrdem(p->Esq); PosOrdem(p->Dir); printf("%d\n", p->Chave); } A B 7 4 2 5

76 COMPUTER SCIENCE 32 1 46 78 ABC 5 9 Caminhamento pós-ordem void PosOrdem(Apontador p) { if (p == null) return; PosOrdem(p->Esq); PosOrdem(p->Dir); printf("%d\n", p->Chave); } A B 7 4 2 5 C

77 COMPUTER SCIENCE 32 1 46 78 ABC 5 9 Caminhamento pós-ordem void PosOrdem(Apontador p) { if (p == null) return; PosOrdem(p->Esq); PosOrdem(p->Dir); printf("%d\n", p->Chave); } A B 7 4 2 5 C 8 9 6 3 1


Carregar ppt "UNIVERSIDADE FEDERAL DE MINAS GERAIS Árvores Cristiano Arbex Valle Vinicius Fernandes dos Santos"

Apresentações semelhantes


Anúncios Google