Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouIsaque Alves Alencar Alterado mais de 7 anos atrás
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
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.