Jak działa sort wkładka dla pracy tablica BST?

głosy
1

Próbowałem zrobić to recursively..The varaible rodzic całkowitą byłoby tak jakbym, zgodny ze wzorem, 2*i +1o leftChild„s, a 2*i +2po prawej stronie.

void BST::insert(const data &aData)
{
    if ( items[Parent].empty ) 
    {
        items[Parent].theData = aData;
        items[Parent].empty = false;
    }
    else if ( aData < items[Parent].theData )
    {
        Parent = 2 * Parent + 1;
        if ( Parent >= maxSize ) this->reallocate();
        this->insert(aData);
    }
    else
    {
        Parent = (2 * rightChild++)+ 2;
        if ( Parent >= maxSize ) this->reallocate();
        this->insert(aData);
    }
}

Współpracuje przy wkładaniu przedmiotów, które mają mniej niż macierzysta ... Ale kiedy znajdę coś, co jest większe, że wszystkie śruby up: x

void BST::reallocate()
{
    item *new_array = new item[maxSize*2];

    for ( int array_index = 0; array_index < maxSize; array_index++ ) 
    {
        if ( ! items[array_index].empty )
        {
            new_array[array_index].theData = items[array_index].theData;
        }
    }
    maxSize *= 2;
    delete [] items;

    items = NULL;
    items = new_array;
}

Oto mój konstruktor więc nikt nie dostaje już mylić wtedy jestem:

BST::BST(int capacity) : items(new item[capacity]), size(0), Parent(0),
leftChild(0), rightChild(0)
{
    items->empty = true;
    maxSize = capacity;
}
private:
    int size;  // size of the ever growing/expanding tree :)
    int Parent;
    int maxSize;    
    int leftChild;
    int rightChild;
    struct item
    {
        bool empty;
        data theData;
    };
    item *items;    // The tree array

Funkcja wstawiania powyżej jest faktycznie najlepszy mogę dostać ..

                                 R
                                / \
                               /   \
                              /     \
                             L       X
                            / \     / \
                           J   V   K   T   <--The only out of place node.
                          / \   \
                         / NULL  \
                        G        /
                                P

Wkładając: R, L, J, G, X, K, V, P, Tw tej kolejności

Utwórz 18/11/2009 o 01:44
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
1

Podejrzewam problem na tej linii:

    Parent = (2 * rightChild++)+ 2;

Dlaczego używasz rightChild tutaj zamiast (2 * Parent) + 2?

Żeby było bardziej przejrzyste, można dodać kilka prostych funkcji wbudowanych do swojej klasy do obliczania indeksów prawa dzieci i lewych / rodzica, biorąc pod uwagę indeks:

inline int getLeftChildIndex(int nodeNdx) { return (nodeNdx * 2) + 1; }
inline int getRightChildIndex(int nodeNdx) { ... }
inline int getParentIndex(int nodeNdx) { ... }

Można również rozważyć użycie klasy search()lub find()metody (jestem zakładając, że ma jeden), aby określić, gdzie wstawić nowy węzeł. Funkcja wyszukiwania powinien albo wrócić indeks istniejącego węzła (to do ciebie, aby zdecydować, jak obsługiwać wstawianie podwójnych wartości) lub indeks, gdzie należy wprowadzić nową wartość.

Odpowiedział 24/11/2009 o 01:08
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more