Двоичное дерево поиска Array Imp. C ++ - PullRequest
0 голосов
/ 11 ноября 2009

У меня просто проблемы со вставкой в ​​массив ... И с дочерними ответвлениями от корня или "родителя" ..

Я пытался вставить данные в реализацию BST на основе массива:

BST::BST(int capacity) : items(new item[capacity]), size(0)
{
     // define the constructor to the BST Class.
}

void BST::insert (const data& aData)
{
    if ( items[root].empty ) // make the first data the root.
    {
        items[root].theData = aData;
        items[root].empty = false;
        size++;
    }
    else if ( items[root].theData.getName() < aData )
    {
        items[leftChild].theData = aData; // will be overwritten...
        this->insert(aData);
    }
    else if ( aData < items[root].theData.getName() )
    {
        items[rightChild].theData = aData;
        this->insert(aData);
    }   
}   

Несколько вещей не так с этим. Позвольте мне начать с того, что первые входящие данные будут корневыми. Все остальные данные будут сравниваться с этим. Когда я делаю рекурсивные вызовы «вставить», это, по сути, то, как я «думаю», я «пересекаю» (если бы это был связанный список). Главная проблема для меня - знать, что мои левые и правые дети будут перезаписаны. Мне интересно, как я могу продолжать ветвление от дочерних "узлов" ...?

Вот мой заголовочный файл для класса BST, я также обеспокоен, правильно ли я настроил членов и все такое??

class BST
{ 
public:
    BST(int capacity = 5);
    BST(const BST& aTable);

    void insert(const data& aData);
         ....
 private:
    int size;  // size of the ever growing/expanding tree :)

    struct item
    {
        bool empty;
        data theData;
    };

    item  * items;    // The tree array
    int   rightChild; // access to the RHS
    int   leftChild;  // access to the LHS
    int   root;   // index to the root
};

У меня есть другой исходный файл, «данные», в который я делаю вызовы, «getname». До сих пор я определил три простых метода: перегрузка оператора присваивания, перегрузка сравнения '<' и ctor с классом данных: </p>

data::data(char const * const name) : name(new char[strlen(name)+1])
{
    if (name)
    {
        strcpy(this->name , name);
    }  
    else this->name = NULL;
}

data& data::operator=(const data& data2)
{ 
    if ( this != &data2 ) // check for selfassignment
    {
        delete [] name;
        name = NULL;

        this->name = new char[strlen(data2.name)+1];
        strcpy(this->name , data2.name);
    }
    return *this;
     }

bool operator< (const data& d1, const data& d2)
{
    if ( strcmp( d1.getName(), d2.getName() ) == -1 )
    {
        return false;
    }
    else if ( strcmp( d1.getName(), d2.getName() ) == 1 )
    {
        return true;
    }
    return false; // if they are equal return false
}    

1 Ответ

2 голосов
/ 11 ноября 2009

Я вижу несколько проблем. leftChild и rightChild должны быть членами структуры элемента, а не BST, потому что они различны для каждого элемента (или они не должны существовать в виде полей и вычисляться динамически). Я не вижу кода, который когда-либо устанавливает leftChild и rightChild на что-либо.

Похоже, вы пытаетесь рекурсивно определить insert. Вы, вероятно, должны определить вспомогательную функцию вставки, которая принимает и элемент, и индекс точки вставки. Это должно поставить вас на правильный путь.

В статье Википедии есть больше псевдокода, на который вы можете посмотреть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...