Jak funguje vložka sort pro array BST práci?

hlasů
1

Snažil jsem se to udělat recursively..The rodič celočíselné varaible by je jako já, které odpovídají vzorci 2*i +1pro leftChild‚sa 2*i +2na pravé straně.

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);
    }
}

To funguje dobře, když vložení položky, které jsou menší než původní mateřské společnosti ... Ale když jsem najít něco, co je větší, že všechny šrouby 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;
}

Tady je můj ctor takže se nikdo nedostal už zmatená, pak jsem:

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

Funkce vkládání nahoře je vlastně to nejlepší, co můžete dostat ..

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

Při vkládání: R, L, J, G, X, K, V, P, Tv tomto pořadí

Položena 18/11/2009 v 01:44
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
1

Já bych podezření, že váš problém je na této lince:

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

Proč používáte rightChild tu místo (2 * Parent) + 2?

Aby to bylo jasnější, možná budete chtít přidat nějaké jednoduché vložené funkce, aby své třídě pro výpočet indexů doleva / doprava, děti a rodiče, vzhledem k tomu, index:

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

Můžete také zvážit použití třídy search()nebo find()metodu (já jsem za předpokladu, že má jeden) zjistit, kam chcete vložit nový uzel. Funkce vyhledávání by měla buď vrátit index existujícího uzlu (to je jen na vás, rozhodnout, jak zacházet s vložení duplicitní hodnoty), nebo index, kde by měla být vložena nová hodnota.

Odpovězeno 24/11/2009 v 01:08
zdroj uživatelem

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