Anda di halaman 1dari 38

Prof.

Adriano Teixeira de Souza

So estruturas de dados adequadas para a representao de hierarquias. Uma rvore composta por um conjunto de ns.

Existe um n r, denominado raiz, que contm zero ou mais subrvores, cujas razes so ligadas diretamente a r.
A raiz se liga a um ou mais elementos, e cada um destes forma uma nova subrvore. Esses elementos so seus galhos ou filhos.

Fundamentos bsicos
GRAU nmero de subrvores de um n.

FOLHA um n que possui grau zero, ou seja, no possui subrvores.


FILHOS so as razes das subrvores de um n. N no terminal um n que no uma folha e diferente da raiz.

Fundamentos bsicos
A altura de uma rvore o comprimento do caminho mais longo da raiz at uma das folhas. Uma rvore nula tem altura 0. Todos os ns so acessveis a partir da raiz. Existe um nico caminho entre a raiz e qualquer outro n.

Formas de representao grfica

rvore Binria: Uma rvore binria uma rvore que pode ser nula, ou ento tem as seguintes caractersticas:
Existe um n especial denominado raiz; Nenhum n tem grau superior a 2 (dois), isto , nenhum n tem mais de dois filhos; Existe um senso de posio, ou seja, distingue-se entre uma subrvore esquerda e uma subrvore direita.

Atravessamento (ou caminhamento) de rvore a passagem de forma sistemtica por cada um de seus ns;

Diferentes formas de percorrer os ns de uma rvore:


Pr-ordem ou prefixa (busca em profundidade) Em ordem ou infixa (ordem central) Ps-ordem ou posfixa Em nvel

Pr-ordem (prefixa) visitar a raiz; caminhar na subrvore esquerda, segundo este caminhamento; caminhar na subrvore direita, segundo este caminhamento.

Atravessamento em ordem (infixa) caminhar na subrvore esquerda, segundo este caminhamento; visitar a raiz; caminhar na subrvore direita, segundo este caminhamento.

Atravessamento ps-ordem (posfixa) a) caminhar na subrvore esquerda, segundo este caminhamento; b) caminhar na subrvore direita, segundo este caminhamento; c) visitar a raiz.

Atravessamento em nvel Percorre-se a rvore de cima para baixo e da direita para a esquerda.

rvore Estritamente Binria: uma rvore binria na qual todo n tem 0 ou 2 subrvores, ou seja, nenhum n tem filho nico.

rvore Binria Cheia Todos os ns, exceto os do ltimo nvel, possuem exatamente duas subrvores. Uma rvore binria cheia de altura h tem 2h 1 ns.

rvore Degenerada Cada n possui exatamente um filho, e a rvore tem o mesmo nmero de nveis que de ns

Uma rvore denominada rvore binria de busca se: Todo elemento da subrvore esquerda menor que o elemento raiz;
Nenhum elemento da subrvore direita menor que o elemento raiz;
As subrvores direita e esquerda tambm so rvores de busca binria.

Busca
Se o valor for igual raiz, o valor existe na rvore.
Se o valor for menor do que a raiz, ento deve buscar-se na subrvore da esquerda, e assim recursivamente, em todos os ns da subrvore.

Se o valor for maior que a raiz, deve-se buscar na subrvore da direita, at alcanar-se o n folha da rvore, encontrando ou no o valor requerido.

Insero
Se a rvore estiver vazia, cria um novo no e insere as informaes do novo n. Compara a chave a ser inserida com a chave do n analisado:
Se menor, insere a chave na subrvore esquerda; Se maior, insere a chave na subrvore direita.

Insero

Exemplo: Inserir os seguintes elementos: 7, 13, 20, 4, 1, 18, 5, 11 .

Remoo

A remoo de um n um processo mais complexo. Para excluir um n de uma rvore binria de busca, h de se considerar trs casos distintos:
Remoo na folha Remoo de um n com um filho Remoo de um n com dois filhos

Remoo na folha
A excluso na folha a mais simples, basta remov-lo da rvore.

Remoo de um n com um filho


Excluindo-o, o filho sobe para a posio do pai.

Remoo de um n com dois filhos


Neste caso, pode-se operar de duas maneiras diferentes:
Substitui-se o valor do n a ser retirado pelo valor sucessor (o n mais esquerda da subrvore direita);

Substitui-se o valor do n a ser retirado pelo valor antecessor (o n mais direita da subrvore esquerda)

Remoo de um n com dois filhos


Exemplo de remoo substituindo o n pelo seu antecessor.

Remoo de um n com dois filhos


Exemplo de remoo substituindo o n pelo seu sucessor.

rvore representada pelo ponteiro para o n raiz

struct noArv { int info; struct noArv* esq; struct noArv* dir; }; typedef struct noArv NoArv;

rvore vazia representada por NULL:

NoArv* abb_cria (void) { return NULL; }

Imprime os valores da rvore em ordem crescente, percorrendo os ns em ordem simtrica void abb_imprime (NoArv* a) { if (a != NULL) { abb_imprime(a->esq); printf("%d\n",a->info); abb_imprime(a->dir); } }

Explora a propriedade de ordenao da rvore Possui desempenho computacional proporcional altura NoArv* abb_busca (NoArv* r, int v) { if (r == NULL) return NULL; else if (r->info > v) return abb_busca (r->esq, v); else if (r->info < v) return abb_busca (r->dir, v); else return r; }

recebe um valor v a ser inserido retorna o eventual novo n raiz da (sub-)rvore para adicionar v na posio correta, faa: se a (sub-)rvore for vazia
crie uma rvore cuja raiz contm v

se a (sub-)rvore no for vazia


compare v com o valor na raiz insira v na sae ou na sad, conforme o resultado da comparao

NoArv* abb_insere (NoArv* a, int v) { if (a==NULL) { a = (NoArv*)malloc(sizeof(NoArv)); a->info = v; necessrio atualizar os ponteiros para a->esq = a->dir = NULL; as sub-rvores esquerda ou direita quando da chamada recursiva da funo, pois a funo de insero pode alterar } o valor do ponteiro para a raiz da (sub-)rvore. else if (v < a->info) a->esq = abb_insere(a->esq,v); else /* v >= a->info */ a->dir = abb_insere(a->dir,v); return a; }

Cria insere insere insere insere insere insere insere insere insere

6 8 4 5 2 3 1 9 7

recebe um valor v a ser inserido retorna a eventual nova raiz da rvore para remover v, faa: se a rvore for vazia
nada tem que ser feito

se a rvore no for vazia


compare o valor armazenado no n raiz com v se for maior que v, retire o elemento da sub-rvore esquerda se for menor do que v, retire o elemento da subrvore direita se for igual a v, retire a raiz da rvore

para retirar a raiz da rvore, h 3 casos: caso 1: a raiz que folha caso 2: a raiz a ser retirada possui um nico filho caso 3: a raiz a ser retirada tem dois filhos

Caso 1: a raiz da sub-rvore folha da rvore original libere a memria alocada pela raiz retorne a raiz atualizada, que passa a ser NULL

Caso 2: a raiz a ser retirada possui um nico filho libere a memria alocada pela raiz a raiz da rvore passa a ser o nico filho da raiz

Caso 3: a raiz a ser retirada tem dois filhos encontre o n N que precede a raiz na ordenao (o elemento mais direita da sub-rvore esquerda) troque o dado da raiz com o dado de N retire N da sub-rvore esquerda (que agora contm o dado da raiz que se deseja retirar)
retirar o n N mais direita trivial, pois N um n folha ou N um n com um nico filho (no caso, o filho da direita nunca existe)

NoArv* abb_retira (NoArv* r, int v) { if (r == NULL) return NULL; else if (r->info > v) r->esq = abb_retira(r->esq, v); else if (r->info < v) r->dir = abb_retira(r->dir, v); else { /* achou o n a remover */ /* n sem filhos */ if (r->esq == NULL && r->dir == NULL) { free (r); r = NULL; } /* n s tem filho direita */ else if (r->esq == NULL) { NoArv* t = r; r = r->dir; free (t); }

/* s tem filho esquerda */ else if (r->dir == NULL) { NoArv* t = r; r = r->esq; free (t); } /* n tem os dois filhos */ else { NoArv* f = r->esq; while (f->dir != NULL) { f = f->dir; } r->info = f->info; /* troca as informaes */ f->info = v; r->esq = abb_retira(r->esq,v);
} } return r; }

Anda mungkin juga menyukai