有人可以帮助我使用基于数组的二进制搜索树C ++吗?

时间:2009-11-16 02:55:45

标签: c++

这是我到目前为止所做的。

void BST::insert(const data& aData)
{
    if ( items[root_index].empty ) 
    {
        items[root_index].theData = aData;// Get the data.
        items[root_index].empty = false;
        oldRoot.theData = aData;
    }  
    else  
    {   
        if ( aData < items[root_index].theData )
        {
            leftChild = root_index * 2;
            if ( items[leftChild].empty )
            {
                items[leftChild].theData = aData;
                items[leftChild].empty = false;
            }
            else 
            {
              root_index++;
              items[root_index].theData = items[leftChild].theData;                          
                                   items[root_index].empty = false;
              this->insert(aData);
            }
        }
         else if ( items[root_index].theData < aData )
         {
            rightChild = root_index * 2 + 1;
            if ( items[rightChild].empty )
            {
                items[rightChild].theData = aData;
                items[rightChild].empty = false;
            }
            else
            {//this where the problem is for "Z" insertion
                root_index++;
                items[root_index].theData = items[rightChild].theData;
                items[root_index].empty = false;
                this->insert(aData);
            }
        }
        else return;
    }
    items[1].theData = oldRoot.theData;
}

和构造函数:

BST::BST(int capacity) : items(new item[capacity]), size(0),
leftChild(0), rightChild(0), root_index(1)
{
     items->empty = true;
     maxSize = capacity-1;
}

它不起作用。我不知道为什么。我似乎无法编写代码来使其平衡。到目前为止我所拥有的是一棵类似于:

的树
       R
      /
     A
      \
       F

当插入“R”,“A”和“F”时,所以当我尝试插入“Z”时,它就变成了F的右孩子。但它确实应该是根本的正确的孩子:

       R
      / \
     A   Z
      \
       F

有人可以帮助我这样做吗?

1 个答案:

答案 0 :(得分:1)

我可能会遗漏一些东西,但代码看起来好像搞砸了。 root_index++,在向树添加数据后递归调用insert() ...您可能想要回到此图纸上的绘图板。

如果您要使用完整的二叉搜索树(这是使用数组的主要原因),您可以将新元素附加到数组并移动打破树顺序不变量的元素(左后代&lt;节点和树上的节点&lt;右后代。