这是我到目前为止所做的。
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
有人可以帮助我这样做吗?
答案 0 :(得分:1)
我可能会遗漏一些东西,但代码看起来好像搞砸了。 root_index++
,在向树添加数据后递归调用insert()
...您可能想要回到此图纸上的绘图板。
如果您要使用完整的二叉搜索树(这是使用数组的主要原因),您可以将新元素附加到数组并移动打破树顺序不变量的元素(左后代&lt;节点和树上的节点&lt;右后代。