Двоичное дерево C ++ (Родители)

голоса
0

Мне нужна только немного больше помощи на моей BST. Это то, что мой BST выглядит при вставке:

R, L, J, G

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

Вот код, который делает это.

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

Мой вопрос заключается в том, что, когда бы я должен сделать новый корень? Когда мне нужно сделать новый корень? Для recomparison?

Является ли это правильный подход? Спасибо тем, кто даже и смотреть на мои посты :)

// Конструктор БСТ класса и его частный раздел.

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
Задан 17/11/2009 в 21:59
источник пользователем
На других языках...                            


2 ответов

голоса
1

Ваша логика (довольно нечеткая я должен сказать), как представляется, не так: Какие «если» последовательность является то, что?

if ( items[2*i+1].empty )
{
}
else if (!items[2*i+1].empty)
{
   if ( items[2*i+1].empty )
   {
        // any code here is unreachable
   }
}
Ответил 17/11/2009 в 22:12
источник пользователем

голоса
1

Я предлагаю вам переопределить эту работу рекурсивно. Что-то вроде этого:

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

Это не совсем ясно, что Родитель, LeftChild и RightChild делает в своем классе, но это отдельный вопрос.

Ответил 17/11/2009 в 22:46
источник пользователем

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