我遇到了B树(不是二叉树)的问题。它适用于某些值,但是当我尝试使用(1,2,3,4,5,6)时,我得到了这个输出:
Level 0: 2 4
Level 1: 1 3 6 5
正确输出
时Level 0: 2 4
Level 1: 1 3 5 6
我需要帮助,我找不到代码的问题。
这是我的代码:
template <class T>
void ArvoreB<T>::Insere(ArvoreB *A, T k){
Pagina *r = A->raiz;
if(r->n == 2*a -1){
Pagina *s = new Pagina();
s->folha = false;
s->n = 0;
s->c[0] = r; // Como é o primeiro filho que recebe R, entao é na posição 0 (primerio filho)
A->raiz = s;
ArvoreBDivideFilho(s, 0, r); //0 é a posição que vai receber o valor;
ArvoreBInsereNaoCheio(s, k);
} else {
ArvoreBInsereNaoCheio(r,k);
}
}
template <class T>
void ArvoreB<T>::ArvoreBDivideFilho(Pagina *x, int i, Pagina *y){// a pagina x vai receber a pagina y e z
Pagina *z = new Pagina();
z->folha = y->folha;
z->n = a-1;
for (int j = 0; j < a-1; j++){
z->keys[j] = y->keys[j+a];
} // copia a parte direita pra um filho
if(not y->folha) // passa o filho dos filhos pros lugares certos
for (int j = 0; j <= a; j++)
z->c[j] = y->c[j+a];
y->n = a-1; // cortou a metade, entao fica a-1 chaves
for (int j = x->n; j > (i+1); j--){
x->c[j+1] = x->c[j];
cout << j << endl;
} // empurra tudo pra direita 1 casa
x->c[i+1] = z; // poe Z como filho de x
for (int j = x->n; j >= i; j--){
x->keys[j+1] = x->keys[j]; // empurra as KEYS tmb...
}
x->keys[i] = y->keys[a-1];
x->n++;
// aqui TALVEZ rpecisa adicionar mais alguma coisa...
//disk write X Y Z
}
template <class T>
void ArvoreB<T>::ArvoreBInsereNaoCheio(Pagina *x, T k){
int i = x->n-1;
if(x->folha){
while(i >= 0 and k < x->keys[i]){ // Arrasta pro lado, tudo que for maior que k
x->keys[i+1] = x->keys[i];
i--;
}
x->keys[i+1] = k;
x->n++;
} else {
while (i >= 0 and k < x->keys[i]) i--; //acha o filho
i++;
// Achou o filho certo (x->c[i])
//Pagina *f = disk-read(x->c[i]);
Pagina *f = x->c[i];
if(f->n == 2*a-1){ // Pagina cheia
ArvoreBDivideFilho(x,i,f);
if(k>x->keys[i])i++;
}
ArvoreBInsereNaoCheio(f,k);
}
}
答案 0 :(得分:0)
我确实认为问题出现在ArvoreBInsereNaoCheio
附近:
Pagina *f = x->c[i];
if(f->n == 2*a-1){ // Pagina cheia
ArvoreBDivideFilho(x,i,f);
if(k>x->keys[i])i++;
}
ArvoreBInsereNaoCheio(f,k);
i
会增加,但会使用旧f
。在最后一行之前添加f = x->c[i];
可以解决问题。