• Nenhum resultado encontrado

vazio insercaoemarvoreb (Arvore *arvore, TipoChave K) inicio encontre um nó folha para inserir K; enquanto (1) encontre uma posição apropriada no

N/A
N/A
Protected

Academic year: 2021

Share "vazio insercaoemarvoreb (Arvore *arvore, TipoChave K) inicio encontre um nó folha para inserir K; enquanto (1) encontre uma posição apropriada no"

Copied!
9
0
0

Texto

(1)

vazio insercaoEmArvoreB (Arvore *arvore, TipoChave K) inicio

encontre um nó folha para inserir K; enquanto (1)

encontre uma posição apropriada no vetor de chaves para K; se (nó não está cheio) entao

insira K e aumente a quantidade de chaves no nó; retorne;

senao

divida o nó em nó1 e nó2; //nó1 == nó, nó2 é novo

distribua as chaves e os ponteiros igualmente entre nó1 e nó2 e inicialize apropriadamente sua quantidades de chaves

K = última chave de nó1; //a qual é retirada de nó1

80

K = última chave de nó1; //a qual é retirada de nó1 se (nó era a raiz) entao

crie uma nova raiz como ascendente de nó1 e nó2;

coloque K e ponteiros para nó1 e nó2 na raiz e ajuste sua quantidade de chaves para 1;

retorne; senao

nó = seu ascendente; //e agora processe o ascendente de nó fimse

fimse

fimenquanto fim

(2)

Árvores B

Com

base

no

algoritmo

apresentado

elabore uma função em C que execute a

operação em questão.

(3)

Árvores B

Analisaremos agora a implementação na

linguagem C de uma função que efetua a

inserção de uma chave em uma árvore B.

Visando possibilitar uma maior flexibilidade

à árvore B trabalhada redefiniremos as

estruturas de dados capazes de representar

a árvore.

82

a árvore.

#define ordem 5

#define maximoDeChaves ordem-1

/*#define minimoDeChaves (int)ceil(ordem/2.0)-1*/

#define minimoDeChaves 2

typedef int TipoChave;

typedef struct

{

TipoChave chave;

/* ... */

(4)

Árvores B

typedef struct _No

{

int numChaves;

Registro registros[maximoDeChaves];

struct _No *filhos[ordem];

} No;

typedef No *ArvoreB;

A maior complexidade do processo de

83

A maior complexidade do processo de

inserção reside no

ajuste dos ponteiros da

estrutura.

Visando proporcionar uma manipulação

adequada dos mesmos, o processo de

inserção pode ser dividido em três funções,

sendo uma recursiva. Analisaremos agora

estas funções.

(5)

void inserir(Registro reg, ArvoreB *arvore) { int cresceu; Registro regRetorno; No *filhoDir; No *novaRaiz;

inserirAux(reg, *arvore, &cresceu, &regRetorno, &filhoDir);

if (cresceu) { /*Aumetará a altura da árvore criando uma nova raiz*/

novaRaiz = (No *) malloc(sizeof(No));

84

novaRaiz = (No *) malloc(sizeof(No)); novaRaiz->numChaves = 1; novaRaiz->registros[0] = regRetorno; novaRaiz->filhos[1] = filhoDir; novaRaiz->filhos[0] = *arvore; *arvore = novaRaiz; } }

(6)

void inserirAux(Registro reg, ArvoreB arvore, int *cresceu, Registro *regRetorno, ArvoreB *arvRetorno)

{

No *temp; int i, j;

if (arvore == NULL)

{ /*O nó anterior é o ideal para inserir a nova chave*/

*cresceu = 1; *regRetorno = reg; *arvRetorno = NULL; return; } 85 }

/*desce na árvore para localizar o nó folha onde deve-se inserir a chave*/

for (i=1; i < arvore->numChaves &&

reg.chave > arvore->registros[i - 1].chave; i++); if (reg.chave == arvore->registros[i - 1].chave) {/*chave já pertence a árvore*/

printf("\n Erro: Registro ja esta presente.\n"); *cresceu = 0;

return; }

(7)

if (reg.chave < arvore->registros[i - 1].chave)

inserirAux(reg, arvore->filhos[i - 1], cresceu, regRetorno, arvRetorno);

else

inserirAux(reg, arvore->filhos[i], cresceu, regRetorno, arvRetorno);

if (!*cresceu) return;

if (arvore->numChaves < maximoDeChaves)

{ /* Nó tem espaço para inserção da nova chave*/

inserirChaveNoNo(arvore, *regRetorno, *arvRetorno); *cresceu = 0;

return;

86

return; }

/* Overflow: Nó tem que ser dividido */

temp = (No *) malloc(sizeof(No)); temp->numChaves = 0;

temp->filhos[0] = NULL;

if (i <= minimoDeChaves + 1) /*Insere adequadamente a chave no*/

{ /*novo nó ou no nó atual*/

inserirChaveNoNo(temp, arvore->registros[maximoDeChaves - 1], arvore->filhos[maximoDeChaves]);

arvore->numChaves--;

inserirChaveNoNo(arvore, *regRetorno, *arvRetorno); }

(8)

else

inserirChaveNoNo(temp, *regRetorno, *arvRetorno);

for (j = minimoDeChaves + 2; j <= maximoDeChaves; j++)

inserirChaveNoNo(temp, arvore->registros[j - 1], arvore->filhos[j]); arvore->numChaves = minimoDeChaves;

temp->filhos[0] = arvore->filhos[minimoDeChaves + 1]; *regRetorno = arvore->registros[minimoDeChaves];

*arvRetorno = temp;

/*Perceba que a execução da função acaba e cresceu continua

87

/*Perceba que a execução da função acaba e cresceu continua com o valor recebido*/

(9)

void inserirChaveNoNo(ArvoreB arvore, Registro reg, No * subArvDir) { int k; int naoAchouPosicao; k = arvore->numChaves; naoAchouPosicao = k > 0; while (naoAchouPosicao) {

if (reg.chave >= arvore->registros[k - 1].chave) { naoAchouPosicao = 0; break; 88 break; } arvore->registros[k] = arvore->registros[k - 1]; arvore->filhos[k + 1] = arvore->filhos[k]; k--; if (k < 1) naoAchouPosicao = 0; } arvore->registros[k] = reg; arvore->filhos[k + 1] = subArvDir; arvore->numChaves++; }

Referências

Documentos relacionados

Por meio de um deslocamento da metodologia da Autoconfrontação, originalmente elaborada pelo linguista francês Daniel Faïta (1992; 1995; 2005) no contexto da Clínica

Uma resposta efetiva a estes desafios pressupõe, da parte das Bibliotecas do Ensino Superior (BES) e dos seus profissionais a implementação de novos serviços de apoio às

Neste sentido, a Administração Central, por via dos regimes jurídicos dos Subsistemas de Ensino Geral e Técnico-profissional, tenta libertar as escolas outorgando

A campanha experimental de monitorização foi realizada in-situ simultaneamente nos três gabinetes A, B e C representados na Figura 1.c. O gabinete C é considerado

A intenção de refletir sobre a Teoria da Folkcomunicação criada pelo brasileiro Luiz Beltrão, no ano de 1967, e a teoria da mídia radical alternativa formulada pelo inglês John

Na perspectiva de percepção das HQs como elemento favorecedor das interações em sala de aula desenvolvemos a nossa pesquisa, a qual buscou caracterizar os

regulamentares ou regimentais do cargo, no caso de cargo técnico ou científico. 279 - Para os efeitos deste Capítulo, a expressão “cargo” compreende os cargos, funções ou empregos

O estudo teve como objetivo promover uma pesquisa frente ao desenvolvimento dos computadores no decorrer das gerações, mostrando os meios de processamentos de