Binäre Suche Baum C ++ (Eltern)

stimmen
0

Ich brauche nur ein wenig mehr Hilfe auf meinem BST. Dies ist, was mein BST sieht aus wie beim Einfügen:

R, L, J, G

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

Hier ist der Code, lässt es geschehen.

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] }

Meine Frage ist, dass, wenn ich würde eine neue Wurzel machen muß? Wann würde ich eine neue Wurzel machen müssen? Für recomparison?

Ist dieser Ansatz richtig? Vielen Dank an diejenigen, die beide auch an meine Beiträge zu sehen :)

// Der Konstruktor der BST-Klasse und seine privaten Bereich.

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
Veröffentlicht am 17/11/2009 um 21:59
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
1

Ihre Logik (eher Fuzzy muss ich sagen) scheint falsch zu sein: Was für eine Art von „if“ -Sequenz ist das denn?

if ( items[2*i+1].empty )
{
}
else if (!items[2*i+1].empty)
{
   if ( items[2*i+1].empty )
   {
        // any code here is unreachable
   }
}
Beantwortet am 17/11/2009 um 22:12
quelle vom benutzer

stimmen
1

Ich schlage vor, Sie diese reimplementieren rekursiv zu arbeiten. Etwas wie das:

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

Es ist nicht wirklich klar, was Eltern, leftChild und rightChild in Ihrer Klasse tun, aber das ist ein anderes Thema.

Beantwortet am 17/11/2009 um 22:46
quelle vom benutzer

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