Beruflich Dokumente
Kultur Dokumente
com rvores
rvores
rvores
Estrutura
rvores
Exemplo:
rvores
Aplicaes
Composio
de rvores
da estrutura de um livro
Estrutura de Dados
Captulo 1 1.1 Listas 1.2 Pilha 1.3 Fila Captulo 2 2.1 Recursividade 2.1.1 Hanoi Captulo 3 3.1 rvores 3.2 rvores binrias
6
rvores
Aplicaes
Consultoria
Diretoria A
Diretoria B
Informtica
7
Jurdica
rvores
Aplicaes
rvores
Formas
de representao:
Hierrquica:
rvores
Formas
de representao:
de incluso:
Diagrama
10
rvores
Formas
de representao:
por parnteses aninhados:
Representao
11
rvores
Caracterizao
Composta
Este
de uma rvore:
tradicional desenhar as rvores com a raiz para cima e folhas para baixo
12
rvores
Caractersticas
Um
n filho no pode ter dois pais. O filho no sabe quem o pai. Este exemplo no rvore! um grafo.
No arvore!
13
rvores
Representao
raiz
Sub-rvores do n raiz
Filhos de A
Filhos de C
14
rvores
O
nmero de sub-rvores de um n determina o grau de sada desse n. Ou seja, a quantidade de filhos. Grau Mximo, ou grau da rvore
Maior
Ns
que no tem grau (grau == 0), so denominados de n folha Para identificar os ns de uma estrutura, usamos a relao de hierarquia existente em uma rvore genealgica
Filho,
15
rvores
Nvel
Representa
a distncia de um n at a raiz O n de maior nvel nos fornece a altura S existe um caminho da raiz para qualquer n
16
rvores
Nvel
17
rvores
Nvel
Altura da rvore que comea em A 3
nvel 0
nvel 1
nvel 2 nvel 3
18
rvores
Floresta
Conjunto
Caminho
Percusso
realizado para atingir algum n considerando sempre a relao de pai e filho entre eles.
Comprimento
Quantidade
do caminho
de ns percorridos no caminho.
19
rvores
rvore
Cheia
rvore
com nmero mximo de ns. Uma rvore de grau d tem nmero mximo de ns se cada n, com exceo das folhas, tem grau d. Exemplo:
20
rvores
Exerccios
Para
a seguinte rvore:
a) Quais os ns folhas? b) Qual o grau de cada n? c) Qual o grau da rvore? d) Liste os ancestrais dos ns B, G e I. e) Liste os descendentes do n D. f) D o nvel e altura do vrtice F. g) D o nvel e a altura do vrtice A. h) Qual a altura da rvore ?
21
rvores
O
nmero de filhos permitido por n e as informaes armazenadas em cada n diferenciam os diversos tipos de rvores existentes. Tipos de rvores:
Binrias;
B;
AVL; Vermelho
e Preta;
outras...
22
rvores Binrias
23
rvores Binrias
Definio
Tipo
As
de
cada
so
rvore
rvore
binria completa
rvores Binrias
Ilustrao
Razes das sub-rvores
Raiz
A
B
Nivel 1 Esquerda
C Direita
Nivel 2
Folhas
Nivel 3
25
G Grau mximo: 02
rvores Binrias
Representao
Como
em C
26
rvores Binrias
Representao
Como
em C
Filho direito
rvores Binrias
Representao
A
em C (cont.)
maioria das funes de manipulao de rvores so implementadas de forma recursiva Que operaes sero necessrias? Criao/Iniciliazao da rvore Cria n raiz rvore vazia Imprimir a rvore Inserir filho esquerdo Inserir filho direito Remover um determinado n
28
rvores Binrias
Consideraes
Uma
raiz
Uma
Algoritmos
Estrutura
em C
da rvore Inicializao Criao de ns Criao de filhos esquerdo e direito Deslocamento para o filho esquerdo ou direito Impresso (exibio) da rvore Pesquisa
29
rvores Binrias
Percurso
Um
de percurso:
Pr-ordem
rvores Binrias
Tipos
Percorre
de percurso:
Ps-ordem
A B D E F C G
31
rvores Binrias
Tipos
de percurso:
Pr-ordem:
In-ordem
ABDECFG
B D E F
C G
DBEAFCG
DEBFGCA
Ps-ordem
32
rvores Binrias
Implementao?
33
rvores Binrias
Implementao
em C Pr-ordem:
34
rvores Binrias
Implementao
em C In-ordem
35
rvores Binrias
Implementao
em C Ps-ordem
36
rvores Binrias
Implementao
no-recursiva in-ordem
void inordem(arvore arv) { if (!vazia(arv)) { inordem(arv->esq); printf("%d", arv->info); inordem(arv->dir); } }
void inordem_ (arvore arv) { pilha p; arvore aux; criapilha(&p); aux = arv; if (vazia(arv)) return; do { while (aux != NULL) { empilha(&p, aux); aux = (aux->esq); } if (!pilhavazia(p)) { desempilha(&p, &aux); printf("%d ", aux->dado); aux = (aux->dir); } } while (!(pilhavazia(p) && aux == NULL)); }
37
rvores Binrias
A
funo in-ordem recursiva executar muito mais rapidamente que sua correspondente iterativa, contrariando o conceito de que recursividade mais lenta que a iterao.
Isso
rvores Binrias
Implementao:
39
rvores Binrias
Estrutura:
// Tipo base dos elementos da arvore typedef struct elementos { char nome[100]; } t_elemento; typedef struct no { struct no * esq; t_elemento dado; struct no * dir; } t_no; typedef t_no* t_arvore;
40
rvores Binrias
Criar:
// Cria um no vazio t_no * criar () { t_no * no = (t_no*) malloc(sizeof(t_no));
41
rvores Binrias
Vazia?:
// isVazia - testa se um no eh vazio int isVazia (t_no * no) { return (no == NULL); }
42
rvores Binrias
Busca
t_no * busca(t_arvore tree, t_elemento dado) { t_no* achou; if (tree == NULL) return NULL; if (compara(tree->dado, dado)==0) return tree;
43
rvores Binrias
Insere
a raiz
// Insere um noh raiz numa arvore vazia. Retorna 1 se a insercao for bem sucedida, ou 0 caso contrario. int insereRaiz(t_arvore* tree, t_elemento dado) { t_no* novo; if (*tree != NULL) return 0; // erro: ja existe raiz novo = criar(); if (novo == NULL) return 0; // erro: memoria insuficiente novo->dado = dado; *tree = novo; return 1; }
44
rvores Binrias
Insere
a Direita:
// Inserir um filho aa direita de um dado noh int insereDireita(t_arvore tree, t_elemento pai, t_elemento filho) { t_no * f, *p, *novo; // verifica se o elemento ja nao existe f = busca(tree,filho); if (f != NULL) return 0; // erro: dado ja existente
// busca o pai e verifica se ja nao possui filho direito p = busca(tree,pai); if (p == NULL) return 0; // erro: pai nao encontrado if (p->dir != NULL) return 0; // erro: ja existe filho direito
novo = criar(); if (novo == NULL) return 0; // erro: memoria insuficiente
rvores Binrias
Insere
a Esquerda:
// Inserir um filho aa direita de um dado noh int insereEsquerda(t_arvore tree, t_elemento pai, t_elemento filho) { t_no * f, *p, *novo; // verifica se o elemento ja nao existe f = busca(tree,filho); if (f != NULL) return 0; // erro: dado ja existente
// busca o pai e verifica se ja nao possui filho direito p = busca(tree,pai); if (p == NULL) return 0; // erro: pai nao encontrado if (p->esq != NULL) return 0; // erro: ja existe filho direito
novo = criar(); if (novo == NULL) return 0; // erro: memoria insuficiente
rvores Binrias
Exibir:
void exibirPreOrdem(t_arvore tree) { if (tree!=NULL) { printf("%s ", tree->dado.nome); exibirPreOrdem(tree->esq); exibirPreOrdem(tree->dir); } } void exibirInOrdem(t_arvore tree) { if (tree!=NULL) { exibirInOrdem(tree->esq); printf("%s ", tree->dado.nome); exibirInOrdem(tree->dir); } } void exibirPosOrdem(t_arvore tree){ if (tree!=NULL) { exibirPosOrdem(tree->esq); exibirPosOrdem(tree->dir); printf("%s ", tree->dado.nome); } 47 }
rvores Binrias
Exibir:
// Exibir a arvore - Procedimento recursivo, usando um percurso pre-ordem.
// sugestao de uso: exibirGraficamente(arvore, 10, 10, 3); void exibirGraficamente(t_arvore tree, int col, int lin, int desloc) {
// col e lin sao as coordenadas da tela onde a arvore ira iniciar, // ou seja, a posicao da raiz, e desloc representa o deslocamento na tela // (em colunas) de um no em relacao ao no anterior.
if (tree == NULL) return; // condicao de parada do procedimento recursivo gotoxy(col,lin); printf("%s",tree->dado.nome); if (tree->esq != NULL) exibirGraficamente(tree->esq,col-desloc,lin+2,desloc/2+1); if (tree->dir != NULL) exibirGraficamente(tree->dir,col+desloc,lin+2,desloc/2+1); }
48
rvores Binrias
Esvaziar:
void esvaziar(t_arvore *tree) { if (*tree == NULL) return; esvaziar(&(*tree)->esq); esvaziar(&(*tree)->dir); free(*tree); *tree = NULL; }
49
rvores Binrias
Mini-Trabalho; Mostrar
rodando.
50