为了更容易删除叶子,我想知道如何使用我的retreive方法(找到一个节点)在删除之前首先检索它。所以这样我就不必重新编码处于retreive中的相同循环方案:
bool BST::retrieve(const char *key, data& aData) const
{
for ( int i = 0; i < maxSize / 2; i++ )
{//iterate
if (! items[2*i+1].empty &&//proceed
items[2*i+1].theData.getName() < key )
{// then search leftward
if ( items[2*i+1].theData == key )
{
aData.setName(key);
return true;
}
}
else if (! items[2*i+2].empty &&
items[2*i+2].theData.getName() > key )
{ // then search rightward
if ( items[2*i+2].theData == key )
{
aData.setName(key);
return true;
}
}
}// reiterate on condition.
return false;
}
bool BST::remove(const char* key)
{
this->retrieve(key, items[Position].theData );
// get the position of the node we want to delete.
if ( items[2*Position+1].empty &&
items[2*Position+2].empty )
{
// then it is a leaf.
}
}
BST::BST(int capacity) : items(new item[capacity]), Position(0),
leftChild(0), rightChild(0), maxSize(capacity), size(0), isLeaf(0)
{
}
位置变量出现为0.如果我在retreive方法的开头声明一个普通的旧int isLeaf
,然后当我们找到它时,分配它,isLeaf = 2*i+1;
或{{1 }}
然后我需要传递那个POD,isleaf = 2*i+2
作为参数。因此,我需要一个帮助函数的删除方法?
似乎将我的remove方法编码为retreive节点是无关紧要的。
基本上是在索引之后。
答案 0 :(得分:0)
我建议您更改检索功能,以使用找到您要查找的数据索引的函数,然后填充aData字段。然后,您可以在检索和删除功能中使用新函数来查找索引。