Nasıl bir dizi BST çalışmaları için bir ekleme sıralama?

oy
1

Ben, formüle uyan, o olur i gibidir recursively..The ebeveyn tamsayı varaible yapmaya çalıştık 2*i +1için leftChilds' ve 2*i +2hakkı için.

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

Orijinal ebeveyn daha az olan öğeleri eklerken sorunsuz çalışıyor ... Ama ben bir şey bulduğunuzda tüm vidalar daha büyük kadardır: 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;
}

kimse o zaman öyleyim artık kafası karışıyor böylece İşte benim ctor geçerli:

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

Yukarıdaki yerleştirme fonksiyonu aslında alabilirim en iyisi ..

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

Ne zaman ekleme: R, L, J, G, X, K, V, P, Tbu sırayla

Oluştur 18/11/2009 saat 01:44
kaynak kullanıcı
Diğer dillerde...                            


1 cevaplar

oy
1

Ben senin sorunun bu hat üzerinde şüpheli olacaktır:

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

Neden yerine burada rightChild kullanıyorsunuz (2 * Parent) + 2?

şeyleri daha net yapmak için, bir dizin verilen sol / sağ çocuklar ve ebeveyn endeksleri hesaplamak için sınıfa bazı basit satır içi işlevleri eklemek isteyebilirsiniz:

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

Ayrıca sınıfları kullanarak düşünebilirsiniz search()veya find()yeni bir düğüm eklemek için yeri belirlemek için (Ben birine sahip varsayarak) yöntemini. Arama işlevi ya da yeni bir değer eklenmesi gereken dizinini (yinelenen değerlerin yerleştirilmesini nasıl işleneceğine karar için size kalmış) Mevcut düğümün dizini dönmelidir ya.

Cevap 24/11/2009 saat 01:08
kaynak kullanıcı

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