Você está na página 1de 50

Prof. Carlos Caminha carloscaminha@gmail.

com rvores

rvores

Organizao dos dados:


Linear:

Listas, pilhas, filas. Relao sequencial.


No-linear:

Outros tipos de relao entre dados; Hierarquia; rvores Grafos.

rvores
Estrutura

no-linear que representa uma relao de hierarquia Exemplo:


rvore

de diretrios; rvore genealgica.

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

de rvores Organograma de uma empresa


Presidncia

Consultoria

Diretoria A

Diretoria B

Informtica
7

Jurdica

rvores
Aplicaes

de rvores Representao de expresses aritmticas (a + (b * ( (c / d) - e) ) )

rvores
Formas

de representao:

Hierrquica:

rvores
Formas

de representao:
de incluso:

Diagrama

10

rvores
Formas

de representao:
por parnteses aninhados:

Representao

( A (B) ( C (D (G) (H)) (E) (F (I)) ) )

11

rvores
Caracterizao
Composta
Este

de uma rvore:

por um conjunto de ns Existe um n r, chamado n raiz


n contm zero ou mais sub-rvores, cujas razes so ligadas diretamente a r Os ns razes das sub-rvores so ditos filhos do n pai r
Ns

que no tm filhos so chamados de folhas

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

grfica de uma rvore

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

grau de seus ns.

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,

pai, neto, irmo

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

de uma ou mais rvores.

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

de rvore em que seus ns possuem no mximo duas sub-rvores


rvore

de grau mximo igual a 2

As

duas sub-rvores denominadas:


sub-rvore esquerda sub-rvore direita

de

cada

so

rvore
rvore

binria completa

em que cada n possui dois filhos, exceto o n folha.


24

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

poderamos definir a estrutura de dados para representar uma rvore binria?

26

rvores Binrias
Representao
Como

em C

poderamos definir a estrutura de dados para representar uma rvore binria?


typedef struct no { struct no * esq; t_elemento dado; struct no * dir; } t_no;

dado Filho esquerdo n


27

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

rvore representada pelo endereo do n

Uma

rvore vazia representada pelo valor NULL

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

percurso define a ordem em que os ns de uma rvore sero processados


Tipos
Utiliza

de percurso:

Pr-ordem

o n Percorre a sub-rvore esquerda Percorre a sub-rvore direita


In-ordem
Percorre

a sub-rvore esquerda Utiliza o n Percorre a sub-rvore direita


30

rvores Binrias
Tipos
Percorre

de percurso:

Ps-ordem

a sub-rvore esquerda Percorre a sub-rvore direita Utiliza o n

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?

Recursividade Assim como as filas recursivas

33

rvores Binrias
Implementao

em C Pr-ordem:

void exibirPreOrdem(t_arvore tree) { if (tree!=NULL) { printf("%s ", tree->dado.nome); exibirPreOrdem(tree->esq); exibirPreOrdem(tree->dir); } }

34

rvores Binrias
Implementao

em C In-ordem

void exibirInOrdem(t_arvore tree) { if (tree!=NULL) { exibirInOrdem(tree->esq); printf("%s ", tree->dado.nome); exibirInOrdem(tree->dir); } }

35

rvores Binrias
Implementao

em C Ps-ordem

void exibirPosOrdem(t_arvore tree) { if (tree!=NULL) { exibirPosOrdem(tree->esq); exibirPosOrdem(tree->dir); printf("%s ", tree->dado.nome); } }

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

porque a procedure chamadas s operaes empilha() e desempilha()


38

iterativa faz pilhavazia(),

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));

if (no) no->esq = no->dir = NULL; return no;


}

41

rvores Binrias
Vazia?:
// isVazia - testa se um no eh vazio int isVazia (t_no * no) { return (no == NULL); }

42

rvores Binrias
Busca

por determinado elemento:

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;

achou = busca(tree->esq, dado);


if (achou == NULL) achou = busca(tree->dir, dado); return achou; }

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

novo->dado = filho; p->dir = novo; return 1;


45

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

novo->dado = filho; p->esq = novo; return 1;


46

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