【发布时间】:2014-07-01 08:25:43
【问题描述】:
我有这个功能用于删除二叉搜索树中的一个节点,这似乎在我要求它删除根节点的情况下工作。它应该取左边最右边的值并用那个替换节点;但是,一旦发生这种情况,新根节点的子节点指针似乎不会指向原始根节点的子节点。代码如下:
bool delete_node(Node*& root, TYPE data) {
Node* toDelete;
Node* parent;
// This function is defined appropriately elsewhere, and finds the target to be deleted
toDelete = find(data, root);
if (!toDelete) {
return false;
}
// This function is defined appropriately elsewhere, and finds the parent of the node to be deleted
parent = find_parent(root, toDelete);
// Other cases left out because they work
// If the target node has two children:
if (toDelete->left && toDelete->right)
{
// find rightmost child on left that is a leaf
Node *replacement = toDelete->left;
while (replacement->right)
{
replacement = replacement->right;
}
// set the target node's data
toDelete->data = replacement->data;
if (parent)
{
if ( parent->data < toDelete->data )
{
parent->right = replacement;
} else
{
parent->left = replacement;
}
} else
{
// if node has no parents, then it is the root and should be replaced with replacement
// This line here is what seems to be causing my trouble...I think
root = replacement;
}
parent = find_parent(toDelete, replacement);
if (parent)
{
if (parent->left == replacement)
parent->left = NULL;
else
parent->right = NULL;
}
delete toDelete;
return true;
}
}
提前致谢!
【问题讨论】:
-
听起来您需要多考虑一下您的算法。在您牢牢掌握算法及其不变量之前,不要开始编写代码。
-
如果代码适用于除删除根节点之外的所有情况,那么您可以只需将根设置为 -infinity 并且永远不要删除根节点...
-
您可能希望为代码导致的每次更改创建树图。如果您想真正彻底,请为每个可能的场景创建树的状态图,显示在该场景中应用每个功能后出现的树。发现这通常有助于解决此类问题。并且不要将其绘制成它应该看起来的样子,而是根据你当前的代码绘制它的样子。这样你可能会发现错误。
-
@cluemein 为每一步绘制图表确实很有帮助,我设法弄清楚了。谢谢!
-
@eggrollers 您可以发布自己问题的答案并稍后接受。这样做是件好事,因为让它原样挂在这里(未回答)对未来的访问者不是很有用。
标签: c++ nodes binary-search-tree treenode