b树实现中的元素乱序

时间:2016-01-27 18:53:13

标签: c++ b-tree

我遇到了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);
    }
}

1 个答案:

答案 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];可以解决问题。