20
1 Árvores Definição geral: conjunto finito de elementos (nós) o qual ou está vazio, ou é particionável em no máximo n+1 subconjuntos disjuntos onde: um deles é unitário e compõe-se apenas do nó chamado raiz; e os n outros subconjuntos são conhecidos como sub-árvores. árvore T T = { R , T1,T2,..., Tn} R = {r} Figura 1 arvore genérica Figura 2 árvore de hierarquia

Figura 1 arvore genérica - UDESC - CCT · „ As árvores se apresentam em diversas aplicações em jogos, compactação de dados (código de Huffman), métodos de ordenação (heap-sort)

Embed Size (px)

Citation preview

Page 1: Figura 1 arvore genérica - UDESC - CCT · „ As árvores se apresentam em diversas aplicações em jogos, compactação de dados (código de Huffman), métodos de ordenação (heap-sort)

1

Árvores

Definição geral: conjunto finito de elementos (nós) o qual ou está vazio, ou é particionável em no máximon+1 subconjuntos disjuntos onde:

� um deles é unitário e compõe-se apenas do nó chamado raiz;� e os n outros subconjuntos são conhecidos como sub-árvores.árvore TT = { R , T1,T2,..., Tn}R = {r}

Figura 1 arvore genérica

Figura 2 árvore de hierarquia

Page 2: Figura 1 arvore genérica - UDESC - CCT · „ As árvores se apresentam em diversas aplicações em jogos, compactação de dados (código de Huffman), métodos de ordenação (heap-sort)

2

Algumas características:

� Um árvore é definida em termos dela mesma, ou seja, uma árvore é composta de árvores. Por isso écomum dizer que uma árvore é uma estrutura de dados recursiva.

� Nas filas e pilhas o acesso às informações respeita uma ordem cronológica, segundo a chegada dos dadosà estrutura, no que se refere às listas a relação de ordem mais importante (normalmente) é aquelaestabelecida pelo valor de um campo chave. As árvores são estruturas não lineares que apresentam comoprincipal característica a capacidade de representar uma relação de hierarquia, entre os seus componentesde dados.

� As árvores se apresentam em diversas aplicações em jogos, compactação de dados (código de Huffman),métodos de ordenação (heap-sort) e busca (árvore de busca binária), inteligência artificial (árvore dedecisão), indexação, etc.

Alguns conceitos:

� Nó raiz: nó que ocupa a posição mais alta da árvore (diferentemente das árvores da natureza).

� Grau de um nó: número de sub-árvores relacionadas a um nó. Ex: o grau do nó r é n (� )

� Nó folha: nó com grau zero. Ex: D, E, H, I, J e G são folhas

� Caminho: o caminho entre dois nós N1 e N2 corresponde a uma seqüência dos nós que ocorram entreeles, incluindo eles proprios (os extremos do caminho).

� Comprimento de um caminho: corresponde ao número de linhas de ligação (chamadas arestas) entre osnós que compõem o caminho.Ex: . o caminho entre r e J C(r,J) = { r, B, F, J } e o comprimento deste caminho L(r,J) = 3.

OBS: há autores1 que consideram o comprimento do caminho como o número de nós e não o dearestas!!!.

� Nível de profundidade de um nó: comprimento do caminho entre a raiz e o nó considerado.Ex: A raiz r está no nível zero. Os nós A, B e C estão todos no nível 1. Os nós D, E, F e G estão todosno nível 2...

� Altura de uma árvore: o maior caminho entre a raiz e uma folha da árvore ou o nível máximo de umaárvore. Ex: a altura da árvore na

� é 3. A altura de T2 é 2.� Nó pai, nó filho, nós irmãos: o nó raiz é pai das raízes de suas sub-árvores. Essas raízes, por sua vez, são

irmãs entre si (estão no mesmo nível ) e obviamente filhas do mesmo nó pai. Ex: A, B e C são filhos de r.

� Nó ancestral, nó descendente: r e B são ancestrais de I, um nó ancestral de um outro se é pai deste ou paide um ancestral deste. C não é ancestral de I. O raciocínio inverso leva ao conceito de descendente.

1 Scwarcfiter, Jayme L. & Markenzon L. “Estruturas de Dados e Seus Algoritmos”. Rio de Janeiro. Ed. LTC.1994.

Page 3: Figura 1 arvore genérica - UDESC - CCT · „ As árvores se apresentam em diversas aplicações em jogos, compactação de dados (código de Huffman), métodos de ordenação (heap-sort)

3

Árvores binárias

São as árvores cujo grau de cada nó é no máximo igual a dois, ou seja, cada nó possui no máximo duas sub-árvores (esquerda e direita).

Implementação

As árvores podem ser implementadas de maneira estática (sobre um vetor, por exemplo ) ou dinâmica(utilizando alocação memória à medida que ocorram as inserções).

Alocação estática

Na alocação estática utiliza-se um vetor para representar a árvore, não há necessidade de campo específicopara ligação entre os nós, isso pode ser conseguido pela utilização de uma fórmula matemática que definequal o índice (posição física do elemento) a partir do valor do índice do nó pai.

Alocação dinâmica

Na alocação dinâmica as ligações entre os nós é feita por intermédio de campos de apontadores que fazemparte da estrutura de cada nó:

Page 4: Figura 1 arvore genérica - UDESC - CCT · „ As árvores se apresentam em diversas aplicações em jogos, compactação de dados (código de Huffman), métodos de ordenação (heap-sort)

4

ABB - Árvore Binária de Busca

Consiste em uma árvore binária aplicada a operações de busca, onde, por exemplo, cada nó pode representarum registro de dados identificável por um campo chave, o qual preferencialmente é uma chave primária, ouseja, um campo cujo valor identifica individualmente cada registro.

Para qualquer nó N em uma árvore binária de busca, todas as chaves da sua sub-árvore esquerda terão valoresmenores que o valor que ocorre em N e todas as chaves pertencentes à sub-árvore direita de N terão valores(de chave) maiores que o encontrado em N.

As operações sobre a árvore binária de busca devem ser realizadas tomando como referência essa relação deordem entre os nós.

Se a chave for do tipo secundária pode haver casos onde ocorram, na sub-árvore direita, valores ��TXH�DTXHOHapresentado no nó N. Para esses casos que permitem dois ou mais nós com o mesmo valor de chave, cada nóde dados pode prover um apontador para uma possível lista de nós com mesma chave.

Page 5: Figura 1 arvore genérica - UDESC - CCT · „ As árvores se apresentam em diversas aplicações em jogos, compactação de dados (código de Huffman), métodos de ordenação (heap-sort)

5

Figura 3 - árvore binária de busca

As inserções ocorremnas folhas da árvore !

Page 6: Figura 1 arvore genérica - UDESC - CCT · „ As árvores se apresentam em diversas aplicações em jogos, compactação de dados (código de Huffman), métodos de ordenação (heap-sort)

6

Encapsulamento nas Árvore Binária de Busca

As árvore de busca devem ter acesso aos valores dos campos chave dos registros, nas funções de percursoficou clara tal necessidade o que foi resolvido pelo uso da macro-função visita(p). Além dos percursos háoutras operações sobre ABB’s onde o acesso ao valor da chave é imprescindível. Nas inserções, remoções ebuscas, por exemplo, é a partir do valor do campo chave que define-se a posição de um nó durante umainserção ou que identifica-se um determinado nó em operações de busca ou remoção.

No modelo de abstração de dados que temos utilizado qualquer detalhe da informação a ser guardada no TDAestá encapsulada, isso inclui o campo chave. Para mantermos o encapsulamento do tipo e identificador docampo chave, serão utilizadas estratégias utilizando o recurso da macro-função e typedef.

# include “info.h”

typedef struct noArv{ info dados;

struct noArv * esq; struct noArv * dir; } NoArv, * pNoArv;

typedef struct{ pNoArvarv;} Arv, * pArv, * * ppArv;

tda_servidor.h

/ * definição de tipo que permite declarações do mesmotipo da chave mas esconde esse tipo* /

typedef int tipoChave;

/ * macro função que permite acesso ao campo chave masesconde o identificador deste campo * /

# define idChave matricula# define chave(s) (s) .idChave# define MASCARA “valor da chave: % i”

/ * ou (s)-> identificaChave a diferença está na chamadada macro, aqui (s) tem que ser um endereço de umaestrutura que contem o campo chave enquanto queantes (s) tem que ser uma instancia de estrutura quecontem tal campo * /

typedef struct{ tipoChave identificadorDaChave;

...} info;

info.h

Page 7: Figura 1 arvore genérica - UDESC - CCT · „ As árvores se apresentam em diversas aplicações em jogos, compactação de dados (código de Huffman), métodos de ordenação (heap-sort)

7

Busca e inserção em uma ABB

Em ambas operações a ordem entre os nós deve ser preservada.int busca(pArv Arv, tipoChave chave, pInfo pReg){ pNoArv p; p = Arv->arv; while( p != NULL && chave(p->dados) != chave ) chave < chave(p->dados) ?( p = p->esq) : (p = p->dir); if (p != NULL) { *pReg = (p->dados); return SUCESSO } else return FRACASSO; /* não encontrou o registro*/}

/*Considere que os valores de chave não se repetem, caso isso ocorra deve-se prover uma lista para os nóscujas chaves são de mesmo valor */int insercaoArvBinBusc(pArv Arv, pInfo novo) { pNoArv p, q, aux;

tipoChave valorNovo; valorNovo = chave(*novo); p = q = Arv->arv; while( p != NULL ) { if (chave(p->dados) == valorNovo ) return FRACASSO; /* registro já inserido previamente */ else

{ q = p; p = ( valorNovo < chave(p->dados) ? p->esq : p->dir); }

} if ( (aux = (pNoArv) malloc (sizeof(NoArv))) != NULL)

{ aux->dados = *novo; aux ->dir = aux->esq = NULL; /*insere como folha*/ if (q != NULL) if( valorNovo < chave(q->dados) ) q->esq = aux;

else q->dir=aux; else Arv->arv = aux; /* árvore com um único nó */ return SUCESSO; } return FRACASSO; /* não conseguiu alocar memória */ }

Criação de uma ABBint cria(ppArv pp){ int ret = FRACASSO; if ( (*pp = (pArv) malloc(sizeof(Arv)) != NULL ) { (*pp)->Arv = NULL;

ret = SUCESSO; }return ret;}

Page 8: Figura 1 arvore genérica - UDESC - CCT · „ As árvores se apresentam em diversas aplicações em jogos, compactação de dados (código de Huffman), métodos de ordenação (heap-sort)

8

Percursos em Árvores

Percorrer uma árvore significa visitar ou processar (efetuar alguma computação) sistematicamente todos osseus nós.Os métodos de percurso (ou “caminhamento”) não são privilégio das árvores de busca muito menos dasbinárias, são operações possíveis sobre qualquer árvore.Os percursos podem ser de dois tipos: em profundidade ou em largura:1) Percursos em profundidade: podem ser de três tipos (usualmente implementados de forma recursiva)

a) percurso em pré-ordem pre_ordem(p)se (p != Null)

processa(p); pre_ordem(p->esq);

pre_ordem(p->dir);senão

return;b) percurso em pós-ordem pos_ordem(p)

se (p != Null) pos_ordem(p->esq);

pos_ordem(p->dir); processa(p);

senão return;

c) percurso em ordem simétrica ou “emordem” (esse percurso sobre uma árvorebinária de busca, define uma seqüênciaordenada crescente dos registros da árvore,segundo uma chave).

em_ordem(p)se (p != Null) em_ordem(p->esq);

processa(p); em_ordem(p->dir);senão

return;onde processa(no) pode ser qualquer ação de processamento sobre o nó referenciado, por exemplo:

processa(no){ printf(MASCARA, chave(*no));}

ou

processa(no){ inserir o nó em uma lista que conterá o percurso;}

OBS: a MASCARA está encapsulada no módulo info.h, e a macro-função chave( ) é definida no mesmoinfo.h.

2) Percurso em largura: existe apenas um tipo onde a visita aos nós é feita em níveis da árvorePercursoEmLargura( arvore ) Cria fila;

SE (arvore não é vazia e a fila foi criada com sucesso) insere a raiz da árvore na fila;

ENQUANTO(fila não vazia)remove um item I da fila;visita/processa o item removido;

insere os filhos de I na fila;destrói a fila;

Page 9: Figura 1 arvore genérica - UDESC - CCT · „ As árvores se apresentam em diversas aplicações em jogos, compactação de dados (código de Huffman), métodos de ordenação (heap-sort)

9

Remoção em uma ABB

Há três situações possíveis, porém, em todas elas o algoritmo de remoção deve preservar a ordem relativaentre os nós restantes. Uma vez detectado o nó a ser removido (chamaremos de nó p) deve-se identificar se omesmo possui ou não filho(s), daí decorrem as três situações para esse nó:a) Se o nó p é uma folha: a remoção é trivial, basicamente elimina-se p e anula-se o ponteiro estrutural (da

árvore) que para ele apontava;b) Se o nó p possui apenas um filho: p é eliminado e é substituído pelo seu filho;c) Se o nó p possuir os dois filhos: p é eliminado e substituídos pelo seu sucessor ou predecessor segundo o

percurso em ordem. Adotaremos aqui a estratégia mais comum onde o nó eliminado é substituído peloseu sucessor em ordem (rp), que por sua vez é substituído pelo seu filho direito (rp possui apenas o filhoà direita).

Page 10: Figura 1 arvore genérica - UDESC - CCT · „ As árvores se apresentam em diversas aplicações em jogos, compactação de dados (código de Huffman), métodos de ordenação (heap-sort)

10

Considerando a árvore acima:

A) resultado da remoção de um nó folha:

B) resultado da remoção de um nó que possui apenas um filho:

Page 11: Figura 1 arvore genérica - UDESC - CCT · „ As árvores se apresentam em diversas aplicações em jogos, compactação de dados (código de Huffman), métodos de ordenação (heap-sort)

11

C) Agora considere a remoção de um nó com os dois filhos, como aquele cuja chave tem valor 11(figura ):

Page 12: Figura 1 arvore genérica - UDESC - CCT · „ As árvores se apresentam em diversas aplicações em jogos, compactação de dados (código de Huffman), métodos de ordenação (heap-sort)

12

int remocao(pArv Arv, tipoChave ch){ pNoArv p, q, rp, f, s;

p = Arv->arv;q = NULL;while ( p != NULL && chave(p->dados) != ch ){ q = p; p = ( ch < chave(p->dados) ) ? esquerda(p) : direita(p); /* esquerda (p) equivale a p->esq*/} if (p= =NULL)

return FRACASSO; if (esquerda(p) = = NULL)

rp = direita(p); else if(direita(p) = = NULL)

rp = esquerda(p);else{ f = p; rp = direita(p); s = esquerda(rp); while( s != NULL) { f = rp; rp = s; s = esquerda( rp );

} if(f != p) { esquerda(f) = direita( rp );

direita(rp) = direita(p); } esquerda(rp) = esquerda(p);

}if(q = = NULL)

Arv->arv = rp;else (p= =esquerda(q)) ? esquerda(q)=rp : direita(q)=rp;

free(p);

return SUCESSO;}

ATENÇÃO: além das operações acima o TDA-ABB, conforme este conceito vem sendo trabalhado,necessita de várias outras operações básicas, tais como: criação, destruição e purga (adaptadas de umpercurso conveniente), teste da condição árvore vazia.

o item foiencontrado naárvore

encontrando RPo substituto ( sucessorem ordem) de P

RP assumindofilhos de P

RP assumindo aposição de P comofilho de Q

só há um nó na árvore, e rp = = NULL

elimina o nó apontado por P

não achou o item a ser removido

Page 13: Figura 1 arvore genérica - UDESC - CCT · „ As árvores se apresentam em diversas aplicações em jogos, compactação de dados (código de Huffman), métodos de ordenação (heap-sort)

13

Arvores AVL – ABB de altura balanceada

O nome AVL deriva dos seus criadores Adelson-Velskii e Landis.

Considerando a raiz de uma arvore como o fiel de uma balança e suas sub-arvores como suas bandejas. Umaárvore balanceada é aquela em que todos os nós apresentam um nível de equilíbrio aceitável entre as suasduas sub-arvores (bandejas).

Eficiência da busca em árvores AVL

Uma árvore de busca pode degenerar-se ao ponto de praticamente tornar-se uma lista, nesses casos aeficiência de uma operação de busca degenera-se ao grau de uma mera pesquisa seqüencial em uma listaordenada. O fato gerador dessa degeneração é a ordem da seqüência de entrada de dados na árvore. Asremoções, porém, também podem provocar tal o desequilíbrio.

Na prática é inviável efetuar o controle da seqüência de inserção/remoção de itens, deve-se então providenciaruma forma de “ rebalancear” a árvore a cada momento que ela se desequilibra. Para tanto existem algoritmosde inserção e remoção [2,3] que garantem isso caso tais operações provoquem desbalanceamento, taisalgoritmos levam em conta certos critérios de desbalanceamento bem como operações chamadas rotaçõespara recuperar um nível aceitável de equilíbrio da ABB-AVL.

Além de causar uma melhor impressão uma árvore balanceada é mais eficiente pois garante que as buscasmais longas percorrerão caminhos aproximadamente de mesmo comprimento, o que não se pode dizer de umaárvore não balanceada.

Ex: Para um mesmo conjunto de dados pode-se ter uma árvore mais ou menos balanceada:

400,300, 200, 120,100,50

200,100,300 , 50, 120,400

300200

120100

50

400

200

100 300

50 120 400

Page 14: Figura 1 arvore genérica - UDESC - CCT · „ As árvores se apresentam em diversas aplicações em jogos, compactação de dados (código de Huffman), métodos de ordenação (heap-sort)

14

Critério de desbalanceamento

Considera-se que uma árvore se desbalanceou quando pelo menos um dos seus nós apresentar o valorabsoluto da diferença entre as alturas das duas sub-arvores maior que 1 (um). Para a maioria dos autores essadiferença é definida como | he – hd |, onde he corresponde à altura da sub-árvore esquerda e hd à altura da sub-arvore direita de um certo nó.

Uma árvore binária de busca será considerada balanceada se todos os seus nós apresentarem um certo grau deequilíbrio entre as alturas das suas sub-arvores. Considera-se aceitável que a diferença (em valor absoluto)entre as alturas das duas sub-arvores de um nó seja no máximo 1 (um), de onde temos que |he – hd | ����H�SHODdefinição da função módulo2 teremos -1 �����he – hd ) ���.

Normalmente se diz que a diferença (he – hd ) é o fator de balanceamento (FB) de um nó, então, paraconsiderarmos a árvore como balanceada dentro da tolerância |he – hd | �� ��� WRGRV� RV� VHXV� QyV� WHUão queapresentar -1 ��)%�����Uma árvore para ser considerada perfeitamente balanceada deve apresentar apenas FB’s = 0. Eventualmente épossível relaxar o critério de desbalanceamento considerando balanceado um nó com FB no intervalo [-2,2](-2 ��)%�������RX�RXWURV�LQWHUYDORV�PDLV�³UHOD[DGRV´�Certos autores como Szwarcfiter [1] e Wirth [3] consideram FB = hd - he.

Como calcular a altura

O conceito de altura (na verdade o conceito de comprimento de um caminho) varia entre alguns autores. ParaSzwarcfiter [1], por exemplo, a altura de um nó X corresponde ao numero de nós no caminho mais longodesde o nó X (inclusive) até uma folha. Gersting [4], por sua vez, considera que a altura de X corresponde aonúmero de arestas de ligação no maior caminho entre X e uma folha, aqui utiliza-se o primeiro conceito(altura pela contagem do número de nós no caminho).

A altura de uma folha é definida como igual a 1.

2 a) se x

������� ��� � � b) se x >0 |x| = x |x|

��� ����� ��� ���ão para essa inequação corresponde à interseção das soluções para a e b, quando x ������� ��� "! �# %$�! ��'&( )$*�#+,!-&

quando x > 0, |x| = x => x �'&

Page 15: Figura 1 arvore genérica - UDESC - CCT · „ As árvores se apresentam em diversas aplicações em jogos, compactação de dados (código de Huffman), métodos de ordenação (heap-sort)

15

Rotações

Considere a analogia da balança, sugerida anteriormente. Considere também que as arestas nas sub-arvoressão pesos.

No sistema acima, como o FB da raiz é igual a um, uma nova inserção sob a base de Te (mais peso no ladoesquerdo) provocaria um desbalanceamento na raiz ( He = h+1+1, Hd = h). Uma maneira de re-equilibrar abalança é transferir o peso excedente de Te para Td, o que equivale a transferir uma aresta (e um nó). Noentanto tal operação deve preservar a árvore como binária de busca, o que é feito através de operaçõeschamadas rotações.Há duas rotações básicas (as demais são compostas das básicas):

rotação à esquerda: nesse caso o sistema de arestasque contém os nós A e B são girados à esquerda

no * rotacaoEsquerda (p) { q = p->dir; h = q->esq; q->esq = p; p->dir = h; return (q); /* q é a nova raiz */ }

fb = 1

He=h+1 Hd = h Te Td

Page 16: Figura 1 arvore genérica - UDESC - CCT · „ As árvores se apresentam em diversas aplicações em jogos, compactação de dados (código de Huffman), métodos de ordenação (heap-sort)

16

rotação direita: nesse caso o sistema que contém osnós X e Y são girados à direita

no * rotacaoDireita (p) { q = p->esq; h = q->dir; q ->dir = p; p->esq = h; return (q); /* q é a nova raiz */ }

Uma rotação dupla consiste em uma combinação de rotações simples (normalmente) diferentes: uma rotaçãoà esquerda seguida de rotação à direita (E-D) ou o contrário (D-E)

Page 17: Figura 1 arvore genérica - UDESC - CCT · „ As árvores se apresentam em diversas aplicações em jogos, compactação de dados (código de Huffman), métodos de ordenação (heap-sort)

17

Implementação da inserção AVL

A estrutura de um nó de uma árvore binária AVL deve conter um campo adicional para registrar o FB dorespectivo nó.

Um algoritmo de inserção balanceada é dividido em três etapas. Para entendê-las considere o processo deinserção de um novo nó.As etapas são:1) Determinação do nó candidato a desbalancear (C):

C apresenta FB = +1 ou –1 e é o ancestral mais próximo do ponto de inserção. A depender da sub-arvoreonde será inserido o novo nó, este poderá ou não produzir desequilíbrio em C, é por isso que este éconsiderado o “ candidato a desbalancear a árvore” , pois uma nova inserção poderá (ou não) forçá-lo aultrapassar o limite aceitável de equilíbrio (-1 � FB � 1).

Exemplos:

Considerando todas as sub-arvores (triângulos) como balanceadas, repare nos FB’s dos nós.Pela Figura A uma inserção à direita de C provocaria desequilíbrio nesse nó já uma inserção à suaesquerda não provocaria desequilíbrio nesse nó.Pela figura B, seria necessário uma inserção à esquerda para provocar desequilíbrio em C. Já umainserção à direita, seria benéfica.

Apenas certas posições de inserção são capazes de comprometer o nó candidato gerando o efeito dedesbalanceamento.

Page 18: Figura 1 arvore genérica - UDESC - CCT · „ As árvores se apresentam em diversas aplicações em jogos, compactação de dados (código de Huffman), métodos de ordenação (heap-sort)

18

2) “ Rotacionar” ou não ?Se durante a inserção, confirmar-se que o nó candidato irá se desequilibrar, será necessário operar rotaçãodupla ou simples.

3) Qual das rotações será conveniente par grantir o balanceamento ?A resposta a isso também depende do caminho tomado no processo de inserção, levando em consideraçãoo nó C, seu filho S e seu neto GS. As possibilidades são quatro, duas das quais estão ilustradas abaixo:

1) tipo DD: o caminho percorrido inclui avanços à direita de C seguido de novo avanço à direita, nessecaso a rotação deve ser simples à esquerda, ou seja o sistema “ C e seu filho direito” deve ser girado àesquerda. Dois avanços à direita (D) Ã rotação simples à esquerda.

2) tipo DE: avanço do tipo à direita de C seguido de avanço à esquerda, a rotação necessária será dupla, aprimeira para a direita envolvendo o filho e o neto de C, e a segunda à esquerda, realizada sobre osresultados da primeira rotação, desta vez envolvendo C. Avanços primeiro à direita e depois à esquerda(D-E) Ã rotação dupla: E-D.

As outras duas situações são espelhos das anteriores

Para avanço EE, rotação simples à direitaPara avanço ED rotação dupla: C->esq = rotDir(C->esq); rotEsq(C);

Perceba que as rotações simples sempre elevarão o filho de C em um nível e as duplas elevarão o netode C em dois níveis.

Page 19: Figura 1 arvore genérica - UDESC - CCT · „ As árvores se apresentam em diversas aplicações em jogos, compactação de dados (código de Huffman), métodos de ordenação (heap-sort)

19

Algoritmo recursivo de inserção balanceada, adaptado de Szwarcfiter [1] e Wirth [3]. Mas atenção !! Aquiconsidera-se:a) altura calculada pelo conceito de comprimento de caminho através da contagem de nós e não de arestas,b) altura de uma folha como igual a uma unidade (1),c) FB(i) = He(i) – Hd(i).

Em Wirth [3] consta também o algoritmo de remoção AVL porém lá FB = Hd -He.

/* h = = F : não houve desbalanceamento *//* h = = T: possível desbalanceamento */typedef noAVL * pAVL;typedef noAVL ** ppAVL;typedef enum boolean { V, F} BOOL;

BOOL insAVL(int chave, ppAVL pt, BOOL h){ if (pt = = NULL) { (*pt) = criaNoAVL (chave); /*aloca memória inicializa ponteiros p/ NULL e FB = 0*/ h = V; } else if (chave = = (*pt)->chave) h = F; /* não houve inserção, não houve desbalanceamento */ else if (chave < (*pt)->chave) { h = insAVL(chave, &((*pt)->esq),h) ; if (h = = V)

{ switch ((*pt)->fb){ case 1: h = caso1(pt,h ); /* a inserção desbalanceou e deve ser tratada */

break; case 0: pt->fb = 1; /* o nó é uma ex-folha */

break; case -1: pt->fb = 0; /* o nó é um candidato que não desbalanceou */ h = F;

break; }

}

} else

{ h = insAVL(chave, &((*pt)->dir),h) ; if (h = = V)

{ switch ((*pt)->fb){ case 1: (*pt)->fb = 0; /* o nó é um candidato que não desbalanceou */

h = F; break;

case 0: (*pt)->fb = -1; /* o nó é uma ex-folha */ break;

case -1: h = caso2(pt,h ); /* a inserção desbalanceou e deve ser tratada */ break; } }

} return h;}

Page 20: Figura 1 arvore genérica - UDESC - CCT · „ As árvores se apresentam em diversas aplicações em jogos, compactação de dados (código de Huffman), métodos de ordenação (heap-sort)

20

/* determinação qual rotação deve ocorrer (simples -dir ou esq – ou dupla) testando os FB’s nos nósenvolvidos*/

int caso1(ppAVL pt, int h) { ptu = (*pt)->esq; if(ptu->FB = = 1) { /*rotação simples à direita */ (*pt)->fb = 0; (*pt) = rotDir(pt); } else /* rotação dupla */ { ptv = ptu->dir; (*pt)->esq = rotEsq(ptu)); (*pt) = rotDir(*pt);

/*ajuste dos FB’s nos nós envolvidos */ if (ptv->FB = = -1) (*pt)->FB = 1; else (*pt)->FB = 0;

if(ptv->FB = = 1) ptu->FB = -1; else ptu->FB = 0;

(*pt) = ptv; } (*pt)->FB = 0; h = F; return h; }

int caso2(ppAVL pt, int h) { ptu = *pt->dir; if(ptu->FB = = -1) { /*rotação simples à esquerda */ (*pt)->fb = 0; (*pt) = rotEsq(pt); } else /* rotação dupla */ { ptv = ptu->esq; (*pt)->dir = rotDir(ptu)); (*pt) = rotEsq(*pt);

/*ajuste dos FB’s nos nós envolvidos */ if (ptv->FB = = 1) (*pt)->FB = -1; else (*pt)->FB = 0;

if(ptv->FB = = -1) ptu->FB = 1; else ptu->FB = 0;

*pt = ptv; } (*pt)->FB = 0; h = F; return h; }

Bibliografia

[1] Szwarcfiter, Jayme L. & Markenzon L. “ Estruturas de Dados e Seus Algoritmos” . Rio deJaneiro. Ed. LTC. 1994.

[2] Tenembaum, Aaron M. e outros. “ Estruturas de Dados Usando C” . São Paulo. Ed.Makron Books.1995.

[3] Wirth, Niklaus. “ Algorthms + Data structures = Programs” , Ed. Prentice Hall, 1976.

[4] Gersting, Judith L. “ Fundamentos Matemáticos para a Ciência da computação” . Ed. LTC.

[5] Veloso, Paulo et al. “ Estruturas de Dados” . Ed. Campus