İkili arama ağacı C ++ (Ebeveyn)

oy
0

Benim BST'de sadece biraz daha yardıma ihtiyacım var. Bu benim BST eklerken neye benzediği:

R, L, J G

                      R   --Root at Index 0
                     / \
     L @ Index1     L   NULL
                   / \
     J @ Index3   J   NULL
                 / \
     G @ Index7 G  NULL

Burada olmasını sağlıyor koddur.

void BST::insert(const data &aData)
{   
    if ( items[Parent].empty ) 
    {
        items[Parent].theData = aData; // insert at leaf.
        items[Parent].empty = false;
        size++;

        return;
    }           
    for ( int i = 0; i <= size; i++ )
    {
        if ( aData < items[Parent].theData )
        {
            if ( items[2*i+1].empty )
            {
            items[2*i+1].theData = aData;
            items[2*i+1].empty = false;
            }
            else 
                           {
            // we must already have a left child to some root.
                                Parent++;  So make the previous data the root???
            if ( items[Parent].empty )
            {
                items[Parent].theData = items[2*i+1].theData;
                items[Parent].empty   = false;
                Parent = (i-1)/2;
            }
                           } 
        }
        else
        { ...// do the same for data greater than but with items[2*i+2] }

MY soru ihtiyacım ne zaman yeni bir kök yapmak bu? Ne zaman yeni bir kök yapmak gerekir? recomparison için mi?

Bu yaklaşım doğru mu? Hatta hem benim mesajların bakmak olanlara teşekkür ederiz :)

// Yapıcı BST Sınıf ve özel bölüm.

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
Oluştur 17/11/2009 saat 21:59
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
1

(Söylemeliyim oldukça bulanık) Kişisel mantık yanlış olduğu ortaya çıkıyor: Hangi "eğer" tür dizisi bu?

if ( items[2*i+1].empty )
{
}
else if (!items[2*i+1].empty)
{
   if ( items[2*i+1].empty )
   {
        // any code here is unreachable
   }
}
Cevap 17/11/2009 saat 22:12
kaynak kullanıcı

oy
1

Ben özyinelemeli çalışmak için bu reimplement düşündürmektedir. Böyle bir şey:

void BST::insert(const data& aData, int pos) {
    if (items[pos].empty) {
        // insert it here
    }
    else (aData < items[pos].theData) {
        // go to left child
        insert(aData, 2*pos + 1);
    }
    else {
        // go to right child
        insert(aData, 2*pos + 2);
    }
}

Bu leftChild ve rightChild sınıfınızda ne yaptığını Veli gerçekten net değil, ama o ayrı bir mesele.

Cevap 17/11/2009 saat 22:46
kaynak kullanıcı

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