基于数组的二进制搜索树C ++

时间:2009-11-15 07:22:36

标签: c++

我试图通过以下算法构建基于“二进制搜索树”的数组:

http://highered.mcgraw-hill.com/olcweb/cgi/pluginpop.cgi?it=gif%3A:600%3A:388%3A%3A/sites/dl/free/0070131511/25327/tree%5Finsert.gif%3A%3ATREE-INSERT

直到我需要真正实现,我的树类似于:

     R
    / 
   A
    \
     F
      \
       L
      /
     B
      \
       C
        \
         T  

递归。但是,我注意到我需要回到根,“R”....现在尝试这样做..

void BST::insert(const data& aData)
{
item *y = NULL;   // Algorithm calls for NULL assignment..
item *x = new item();       

     // How do i Init LEFT and RIGHT?
     // With no nested copy ctor for struct item?
if ( items->empty ) 
{
    items = new item();
    items->empty = false;
    items->theData = aData; // Get the data.
    ++size;
} 
else if ( size == maxSize ) this->reallocate();
else  
{   
        if ( aData < items->theData )
        {
            x[x->LEFT].theData = aData;
            x->LEFT = x->LEFT + 1;
            this->insert(items->theData);
        }
        else if ( items->theData < aData )
        {
            x[x->RIGHT].theData = aData;
            x->RIGHT = x->RIGHT + 1;
            this->insert(items->theData);
        } 
                       else this->insert(items->theData);
}

这是我在BST类对象文件的私有部分中的items数组的结构: ...

 private:
    int size;  // size of the ever growing/expanding tree :)
    int maxSize;
    struct item
    {
              bool empty;
         int  LEFT;
              int  RIGHT;
              data theData;     
         };

    item *items;    // The tree array
    item *oldRoot;
         int root_index;   // index for the root(s)

嗯。我也超载了赋值运算符......我不知道该说些什么。这个很难(硬。我在网上看了很多例子和讲座;以及算法......

请求的relloaction方法:

void BST::reallocate()
{
    item *new_array = new item[size*2];
    for ( int array_index = 0; array_index < size; array_index++ ) 
    {
        new_array[array_index].theData = items[array_index].theData;
        new_array[array_index].empty = false;
    }
    size *= 2;
    delete [] items;

    items = NULL;
    items = new_array;
}

1 个答案:

答案 0 :(得分:3)

有完善的方法将二叉树实现为数组,它表示根位于索引0,索引 i 的元素的LEFT将在2i + 1处找到RIGHT将在2i + 2处找到。您不需要将LEFT和RIGHT作为结构的一部分。 它必须是

struct item
{
    int index;
    data theData;
};

NOT 在您的结构中存储左索引和右索引。您也不需要跟踪根索引。始终为0.在二叉树上查看wiki article。搜索“存储二叉树的方法”字符串。 如果需要,此实现允许轻松遍历树。