Você está na página 1de 32

Estrutura de Dados

Unidade II

Artur Henrique Kronbauer

Pilha

UEPS (O ltimo a Entrar o Primeiro a Sair)


Topo A B (a) C Topo Desempilha (ponteiro)

Empilha (A) Empilha (B) Empilha (C)

B (b)

Topo
D (c) E

Empilha (D) Empilha (E)

Pilha em Estrutura Esttica


main() { char opcao; int valor; T_pilha *ppilha; ppilha=inicializaPilha(); #define MAXPILHA 10 do typedef struct pilha { printf("\n (E)mpilhar (D)esempilhar (F)inalisar : "); { int elementos[MAXPILHA]; scanf("%c",&opcao); int topo; if ((opcao == 'E') || (opcao == 'e')) } T_pilha; { printf("\n Entre com o numero a incluir : "); scanf("%d",&valor); empilha(valor,ppilha); T_pilha *inicializaPilha(); } void empilha(int, T_pilha *); else if ((opcao == 'D') || (opcao == 'd')) int desempilha(T_pilha *); { valor = desempilha(ppilha); void mostra_dados(T_pilha *); } if ((opcao != 'F') || (opcao != 'f')) { mostra_dados(ppilha); getchar(); } } while ((opcao != 'F') && (opcao != 'f'));
#include <stdio.h> }
3

Pilha em Estrutura Esttica


T_pilha *inicializaPilha() { T_pilha *nova_pilha; nova_pilha=(T_pilha *) malloc(sizeof(struct pilha)); if (nova_pilha == NULL) { printf("\n Nao existe memoria para criar a estrutura"); exit(1); } nova_pilha->topo=0; return(nova_pilha); } void empilha(int v, T_pilha *ppilha) { if (ppilha->topo >= MAXPILHA) { printf("\n Pilha Cheia"); return; } ppilha->elementos[ppilha->topo] = v; ppilha->topo++; }
4

como consultar um elemento

Pilha em Estrutura Esttica


int desempilha(T_pilha *ppilha) { if (ppilha->topo == 0) { printf("\n Pilha Vazia"); return(-1); } ppilha->topo--; return(ppilha->elementos[ppilha->topo]); } void mostra_dados(T_pilha *ppilha) { int aux = ppilha->topo-1; printf("\n Dados existentes na pilha"); while (aux != -1) { printf("\n %d",ppilha->elementos[aux]); aux--; } }

Pilha em Estrutura Dinmica


main() #include <stdio.h> { char opcao; int valor; T_pilha *ppilha; ppilha=inicializaPilha(); do typedef struct nodo { printf("\n (E)mpilhar (D)esempilhar (F)inalisar : "); { int info; scanf("%c",&opcao); struct nodo *prox; if ((opcao == 'E') || (opcao == 'e')) } T_nodo; { printf("\n Entre com o numero a incluir : "); scanf("%d",&valor); typedef struct pilha empilha(valor,ppilha); { struct nodo *topo; } } T_pilha; else if ((opcao == 'D') || (opcao == 'd')) { valor = desempilha(ppilha); void empilha(int, T_pilha *); } int desempilha(T_pilha *); if ((opcao != 'F') || (opcao != 'f')) { mostra_dados(ppilha); T_pilha *inicializaPilha(); getchar(); void mostra_dados(T_pilha *); } } while ((opcao != 'F') && (opcao != 'f')); }
6

Pilha em Estrutura Dinmica


T_pilha *inicializaPilha() { T_pilha *nova_pilha; nova_pilha=(T_pilha *) malloc(sizeof(struct pilha)); if (nova_pilha == NULL) { printf("\n Memria insuficiente"); exit(1); } nova_pilha->topo=NULL; return(nova_pilha); }

void empilha(int v, T_pilha *ppilha)


{ T_nodo *novo; novo=(T_nodo *) malloc(sizeof(struct nodo)); if (novo == NULL) { printf("\n Memria insuficiente "); exit(1); } novo->info = v; novo->prox = ppilha->topo; ppilha->topo = novo;

}
7

Pilha em Estrutura Dinmica


int desempilha(T_pilha *ppilha)

void mostra_dados(T_pilha *ppilha)


{ T_nodo *aux = ppilha->topo;

{ int v;
T_nodo *aux = ppilha->topo;

printf("\n Dados existentes na pilha");


while (aux != NULL)

if (ppilha->topo == NULL)
{ printf("\n Pilha Vazia");

{ printf("\n %d",aux->info);
aux=aux->prox;

return(-1);
}

}
}

v = aux->info;
ppilha->topo=aux->prox;

free(aux);
return(v);

Recursividade
Definio
A recursividade pode ser considerada um mtodo eficaz para resolver um problema originalmente complexo, reduzindo-o em pequenas ocorrncias do problema principal. Assim, segue a idia de dividir para conquistar. Resolvendo, isoladamente, cada uma das pequenas partes, podemos obter a soluo do problema original como um todo.

Caractersticas de uma funo recursiva


Definio de parmetros; Condio de parada da recurso, para que a rotina no seja chamada infinitamente; Chamada da funo dentro dela prpria;

Rotinas recursivas e pilhas


O controle de chamadas e de retorno de rotinas efetuado por uma pilha (criada e mantida dinamicamente pelo sistema). Quando uma rotina chamada, empilha-se o endereo da rotina e todas as variveis locais so recriadas. Quando ocorre o retorno da rotina as variveis locais que foram criadas deixam de existir.

Vantagens
Facilidade na resoluo de alguns tipos de problemas.

Desvantagens
Uso demasiado dos recursos computacionais de um computador.
9

Recursividade
#include <stdio.h> if ((op == 'l') || (op == 'L')) indice=busca_linear(numero,0); int busca_linear(int, int); else int busca_binaria(int,int, int); indice=busca_binaria(numero,0,total); int fat(int); if (indice == -1) printf("\n Elemento nao encontrado"); const total=10; else int vet[10]; printf("\n Encontrado no indice : %d",indice); numero=fat(numero); main() printf("\n O fatorial e : %d ",numero); { int i, numero, indice=-1; getchar(); char op; Programa que degetchar(); printf("\n Entre com 10 numeros \n "); monstra Busca Bin} for (i=0; i < total; i++) ria, Busca Linear e Clculo do Fatorial scanf("%d",&vet[i]); printf("\n Entre com o numero a pesquisar e calcular o fatorial \n "); de forma recursiva. scanf("%d",&numero); printf("\n Qual a pesquisa? (B)inaria ou (L)inear "); scanf("%c",&op); Para realizar a pesquisa Binria necessrio que o vetor esteja ordenado
10

Recursividade
int busca_linear(int n, int i) { if ((i < total) && (vet[i] != n)) return (busca_linear(n,i+1)); else { if (i == total) return(-1); else return(i); } }

Parmetros int fat(int n) { int res; Variveis locais if (n == 0) return 1; else Condio de parada { res = fat(n-1); res = res * n; Chamada da prpria funo return res; } }

int busca_binaria(int n, int inicio, int fim) { int meio; if (inicio <= fim) { meio = (inicio+fim)/2; if (vet[meio] == n) return meio; else if (vet[meio] < n) return busca_binaria(n,meio+1,fim); else return busca_binaria(n,inicio,meio-1); } else return -1; }

11

rvores
Definio:

Relao de hierarquia ou de composio entre os dados (ns).

Conjunto finito T de um ou mais ns, tais que:


(a) existe um n denominado raiz da rvore;

(b) os demais ns formam m >= 1 conjuntos disjuntos S1,...,Sm,


onde cada um desses conjuntos uma rvore.

As rvores Si recebem a denominao de Sub-rvores.

Terminologia:

Cada n da rvore a raiz de uma Sub-rvore. O nmero de Sub-rvores de um n o grau daquele n. Um n de grau igual a zero denominado folha ou n terminal. A raiz da rvore tem nvel 0. Os demais ns: nvel = nmero de "linhas" que o liga raiz. Altura: nvel mais alto da rvore.
12

rvores
Representao Estrutural:
A B E C Grau = 3; Nvel =0 (raiz) D Grau = 1; Nvel = 1 Grau = 3; Nvel = 2 K Grau = 0; Nvel = 3

G I

H J

Grau = 0 (Folha)

rvore com altura igual a 3.

13

rvores Binrias
Definio: Uma rvore binria uma estrutura de dados til quando precisam ser tomadas decises bidirecionais em cada ponto de um processo.
O Grau de cada n menor ou igual a 2 (Sub-rvores da esquerda e da direita).

Se grau = 1, deve ser especificado se a sua Sub-rvore a da esquerda ou a da direita.


rvore Estritamente Binria: a rvore onde todo o n que no folha possu Sub-rvores a esquerda e a direita. Uma rvore binria completa uma rvore estritamente binria sendo que todas as folhas devem estar no mesmo nvel.
14

rvores Binrias
Representao Estrutural:
rvore Estritamente Binria

rvore Binria Completa

5
8 6 9 7
A

2 1

Como construir uma rvore? Como percorrer uma rvore ? Aplicaes de rvores binrias Exemplos:
F

G 15

rvores Binrias - Percurso


A natureza recursiva de uma rvore binria: Existem trs mtodos recursivos para que possamos percorrer uma rvore passando por todos os seus elementos:
Em Pr-ordem 1. visitamos a raiz 2. Sub-rvore esq. em pr-ordem 3. Sub-rvore dir. em pr-ordem
Em Ordem 1. Sub-rvore esq. em ordem 2. visitamos a raiz 3. Sub-rvore dir. em ordem. Em Ps- Ordem 1. Sub-rvore esq. em ps-ordem 2. Sub-rvore dir. em ps-ordem 3. Visitamos a raiz

(Centro, Esquerda, Direita)

(Esquerda, Centro, Direita)

(Esquerda, Direita, Centro)

16

rvores Binrias - Percurso


Exemplos:
5 4 2 3 9

7 6
8

10

Pr-ordem: 5, 4, 2, 3, 9, 7, 6, 8, 10 Em ordem: 2, 3, 4, 5, 6, 7, 8, 9, 10 Ps-ordem: 3, 2, 4, 6, 8, 7, 10, 9, 5

20 10 5 2 4

15 6 7 12 18 19

17

Pr-ordem: 20, 10, 5, 2, 4, 6, 7, 15, 12, 18, 17, 19 Em ordem: 2, 4, 5, 6, 7, 10, 12, 15, 17, 18, 19, 20 Ps-ordem: 4, 2, 7, 6, 5, 12, 17, 19, 18, 15, 10, 20
17

rvores Binrias de Pesquisa


Regra Geral de Insero:
Os valores menores devem ficar a esquerda da raiz e os maiores a direita. Os valores repetidos no devem ser inseridos. As inseres sempre so feitas nas folhas, dessa forma, deve se percorrer a rvore at encontrar a folha que ser o pai do novo elemento a ser inserido. O percurso baseado no valor da informao que est sendo inserida. Se o novo elemento for menor que o n comparado, deve andar para a esquerda, caso contrrio deve andar para a direita.

Exemplo

Exerccio:
Crie uma rvore com os seguintes ns: 14, 15, 4, 9, 7, 18, 2, 5, 16, 4, 20, 17, 9, 5.

18

rvores Binrias de Pesquisa


#include <stdio.h>
typedef struct nodo { int info; struct nodo *pai; struct nodo *f_esq; struct nodo *f_dir; char } T_nodo; typedef struct arvore deletado; T_arvore *inicializa_arvore(); T_nodo *cria_nodo(int, T_nodo *);

void insere(int, T_arvore *);


T_nodo *consulta(int, T_arvore *);

void ordem(T_nodo *);


void pre_ordem(T_nodo *);

void pos_ordem(T_nodo *);


void retira(int, T_arvore *);

{ struct nodo *raiz;


int qtd;

} T_arvore; T_arvore *parvore;

T_arvore *inicializa_arvore() { T_arvore *nova_arvore; nova_arvore=(T_arvore *) malloc(sizeof(struct arvore)); if (nova_arvore == NULL) { printf("\n Memoria insuficiente para alocar estrutura"); exit(1); } nova_arvore->raiz=NULL; nova_arvore->qtd=0; return(nova_arvore); }
19

rvores Binrias de Pesquisa


main() { char opcao; int informacao=0; parvore = inicializa_arvore(); do { printf("\n (I)ncluir (C)onsultar (R)emover (O)rdem Pr(E)-Ordem Po(s)-Ordem (F)im: "); scanf("%c",&opcao); else if ((opcao == 'E')||(opcao == 'e')) if ((opcao == 'I')||(opcao== 'i')) { pre_ordem(parvore->raiz); { printf("\n Entre com a informacao : "); } scanf("%d",&informacao); else if ((opcao == 'S')|| (opcao == 's')) insere(informacao, parvore); { pos_ordem(parvore->raiz); } } else if ((opcao == 'C')||(opcao=='c')) else if ((opcao == 'R')|| (opcao == 'r')) { printf("\n Entre com a informacao : "); { printf("\n Entre com a informacao : "); scanf("%d",&informacao); scanf("%d",&informacao); consulta(informacao,parvore); retira(informacao, parvore); } } else if ((opcao == 'O')||(opcao == 'o')) getchar(); { ordem(parvore->raiz); } while ((opcao != 'F') && (opcao != } 'f')); } 20

rvores Binrias de Pesquisa


T_nodo *cria_nodo(int n, T_nodo *p)
{ T_nodo *novo; novo=(T_nodo *) malloc(sizeof(struct nodo)); if (novo == NULL) { printf("\n Memoria insuficiente para alocar estrutura"); exit(1); } void pre_ordem(T_nodo *sub_raiz) { if (sub_raiz != NULL) { if (sub_raiz->deletado == 'V') printf("\n * %d",sub_raiz->info); else printf("\n %d",sub_raiz->info); pre_ordem(sub_raiz->f_esq); pre_ordem(sub_raiz->f_dir); } }

novo->info=n;
novo->pai=p;

novo->f_esq=NULL;
novo->f_dir=NULL;

novo->deletado='f';
return(novo);

21

rvores Binrias de Pesquisa


void insere(int n, T_arvore *parvore) { T_nodo *p, *aux; if (parvore->raiz == NULL) { parvore->raiz = cria_nodo(n,NULL); } else { p=parvore->raiz; aux=parvore->raiz; while (n != p->info && aux != NULL) { p=aux; if (n < p->info) aux = p->f_esq; else aux = p->f_dir; } if (n == p->info) { printf("\n Numero Repetido"); return; } else if (n < p->info) { p->f_esq=cria_nodo(n, p); } else { p->f_dir=cria_nodo(n, p); }

} parvore->qtd++;

void ordem(T_nodo *sub_raiz) { if (sub_raiz != NULL) { ordem(sub_raiz->f_esq); if (sub_raiz->deletado == 'V') printf("\n *%d",sub_raiz->info); else printf("\n %d",sub_raiz->info); ordem(sub_raiz->f_dir); } }
22

rvores Binrias de Pesquisa


void retira(int n, T_arvore *parvore) { T_nodo *aux=parvore->raiz, *remover=parvore->raiz; if (parvore->raiz == NULL) { printf("\n Arvore sem elementos"); } else { while ((aux != NULL) && (n != remover->info)) { remover = aux; if (n < remover->info) aux = remover->f_esq; else aux = remover->f_dir; } if (n == remover->info) { remover->deletado='V'; // remove logicamente parvore->qtd--;

Continuao na prxima transparncia


23

rvores Binrias de Pesquisa


while ((remover != NULL) && (remover->deletado == 'V')) { if ((remover->f_esq == NULL) && (remover->f_dir == NULL)) { if (remover != parvore->raiz) { aux=remover->pai; // remove fisicamente um nodo if (aux->f_esq == remover) aux->f_esq=NULL; else aux->f_dir=NULL; } else { parvore->raiz=NULL; // remove fisicamente a raiz } } remover=remover->pai; }
} else { } } }
24

printf("\n Elemento nao encontrado");

rvores Binrias de Pesquisa


T_nodo *consulta(int n, T_arvore *parvore)
{ T_nodo *p, *aux; else

p=parvore->raiz;
aux=parvore->raiz;

{ printf("\n Informacao Inexistente");


return(NULL);

while ((n != p->info) && (aux != NULL))


{ p=aux;

}
}

if (n < p->info)
aux = p->f_esq;

else
aux = p->f_dir;

}
if (n == p->info)

{ if (p->deletado != 'V')
printf("\n Informacao Existente"); else return(p); }

void pos_ordem(T_nodo *sub_raiz) { if (sub_raiz != NULL) { pos_ordem(sub_raiz->f_esq); pos_ordem(sub_raiz->f_dir); if (sub_raiz->deletado == 'V') printf("\n *%d",sub_raiz->info); else printf("\n %d",sub_raiz->info); } }

printf("\n Informacao removida logicamente");

25

rvores AVL
Definio:
Uma rvore AVL uma rvore binria de busca construda de tal modo que a altura de sua Sub-rvore direita difere da altura da Sub-rvore esquerda de no mximo 1.

O que pode acontecer quando um novo n inserido numa rvore balanceada ?


Ns 9 ou 11 podem ser inseridos sem balanceamento . Sub-rvore com raiz 10 passa a ter uma Sub-rvore e Sub-rvore com raiz 8 vai ficar melhor balanceada ! Insero dos ns 1, 3, 5 ou 7 requerem que a rvore seja rebalanceada!

Fator de Balanceamento de um n:
a altura da Sub-rvore direita do n menos a altura da Sub-rvore esquerda do n . FB= altura direita - altura esquerda Se todos os FB forem [-1, 0, 1] a rvore est balanceada.
26

rvores AVL
Rebalanceamento:
Nos casos abaixo considere P como sendo o n raiz de uma Subrvore desbalanceada e U como sendo o n filho dessa raiz.

Caso 1: Altura Esquerda de P > Altura Direita de P Caso 1.1 : Altura Esquerda de U > Altura Direita de U Rotao a direita

Caso 1.2 : Altura Esquerda de U < Altura Direita de U


Rotao para a esquerda e em seguida para a direita
27

rvores AVL
Caso 2: Altura Direita de P > Altura Esquerda de P Caso 1.2: Altura Direita de U > Altura Esquerda de U

Rotao a esquerda

Caso 2.2 : Altura Esquerda de U > Altura Direita de U

Rotao para a direita e em seguida para a esquerda

28

rvores AVL
Exemplos de Rotaes ( Rotao simples a direita):
4

Rotao a Direita

1 0

Exemplos de Rotaes ( Rotao dupla a direita):

Rotao a Esquerda e a Direita

29

rvores AVL
Exemplos de Rotaes (rotao simples a esquerda) :
1 0

Rotao a Esquerda
4

1 5
9 1 2

Exemplos de Rotaes ( Rotao dupla a esquerda):


1 0
5 2 0 3 0 25 1 0

Rotao a Direita e a Esquerda


Inserir 25

2 5 2 0

3 0

30

rvores - B
Definio:
a Construo e manuteno de rvores de busca de grandes dimenses. Ponteiros referem-se a reas de memria secundria, em vez de representarem endereos da memria principal. Busca: acesso a disco (com os inerentes atrasos de acesso). Sub-rvores representadas em unidades, do ponto de vista de acesso pginas Reduz o nmero de acessos ao disco. Necessita de esquema de crescimento controlado. Todo n, exceto a raiz, deve possuir entre n e 2n chaves, para uma dada constante n.

Caractersticas:
Cada pgina (n) contm no mximo, 2n elementos (chaves); cada pgina, exceto a que contm a raiz, contm no mnimo n chaves; os ns chamados folhas no tm descendentes e os demais(ns de derivao) possuem m + 1 descendentes, onde m a quantidade de chaves; todas as folhas tm o mesmo nvel.
31

rvores - B
Representao Estrutural:

K1 P0 P1

K2 P2

... ...

Km Pm-1 Pm

Exemplo: rvore B (ordem 2):


Raiz

30 15 22 40 50

2689

17 18 20 21

27 29

36 38 39

42 45 48

51 53 55 56

32

Você também pode gostar