Binary search tree 二叉搜索树-删除
我试图编写一个程序,接收字符串并按字母顺序将它们放在二元搜索树中。一旦这些字符串被插入到树中,用户会提示删除一个单词,从而从树中删除该节点,然后按顺序输出树而不返回该节点 在delete函数之前,一切都是这样的,delete函数确实可以工作,但是它删除的方式非常奇怪。我认为目前它删除了树的完整部分,因为当我删除最后一个单词时,它通常是有效的。我将上传我的删除功能,如果需要更多,我可以上传我的代码的其余部分 谢谢Binary search tree 二叉搜索树-删除,binary-search-tree,Binary Search Tree,我试图编写一个程序,接收字符串并按字母顺序将它们放在二元搜索树中。一旦这些字符串被插入到树中,用户会提示删除一个单词,从而从树中删除该节点,然后按顺序输出树而不返回该节点 在delete函数之前,一切都是这样的,delete函数确实可以工作,但是它删除的方式非常奇怪。我认为目前它删除了树的完整部分,因为当我删除最后一个单词时,它通常是有效的。我将上传我的删除功能,如果需要更多,我可以上传我的代码的其余部分 谢谢 template<typename T> void Delete(Tre
template<typename T> void Delete(TreeNode<T>*& root, const T& data)
{
if (root == NULL)
return;
if(data < root->Value)
return Delete(root->Left, data);
else if (root->Value > data)
return Delete(root->Right, data);
else
{
TreeNode<T>* old_root = root;
if (root->Left == NULL)
{
root = root->Right;
}
else if (root->Right == NULL)
{
root = root->Left;
}
else
{
replace_parent(old_root, old_root->Left);
}
delete old_root;
}
};
template<typename T> void replace_parent(TreeNode<T>*& old_root, TreeNode<T>*& root)
{
if (root->Right != NULL)
{
replace_parent(old_root, root->Right);
}
else
{
old_root->Value = root->Value;
old_root = root;
root = root->Left;
}
};
template void Delete(TreeNode*&根、常量和数据)
{
if(root==NULL)
返回;
如果(数据<根->值)
返回删除(根->左,数据);
else if(根->值>数据)
返回删除(根->右,数据);
其他的
{
TreeNode*old_root=根;
如果(根->左==NULL)
{
根=根->右;
}
else if(root->Right==NULL)
{
根=根->左;
}
其他的
{
替换父项(旧根、旧根->左);
}
删除旧根;
}
};
模板无效替换父项(TreeNode*&旧根、TreeNode*&根)
{
如果(根->右!=NULL)
{
替换父项(旧的根,根->右);
}
其他的
{
旧根->值=根->值;
老根=根;
根=根->左;
}
};
您认为左侧或右侧为NULL
的情况都很好。然而,不幸的是,它们都不是NULL
的逻辑失败了
如果我正在阅读您的代码(并且正确理解函数replace\u parent()
),那么如果两个树都不为空,那么您将用Left
替换当前根目录
问问你自己,右侧
子树中的值发生了什么变化
要删除节点,需要执行以下操作:
左
子树,因此我们将从那里开始左子树的右子树往下走。继续走,直到找到右叶节点(没有右子树;左可以)
tmp
变量中右叶的值Left
(无论NULL
与否)转移到右叶的位置tmp
值并将其放入原始的“删除”节点拉基的观点是正确的 我告诉您,在删除节点时,需要将其替换为左子树中的最大节点或右子树中的最小节点。例如: 如果您看到下图: 如果要删除节点90,需要注意将其替换为左子树中的最大节点80或右子树中的最小节点92。可以保留任何一种方法 因此,算法将是: 考虑到左子树: ->如果找到要删除的节点,请导航到其左子树中的最大值 ->将节点的左侧指定为50,将节点的右侧指定为150
->将75->next设为null并删除90我认为问题出在replace_parent上。你能发布代码吗?有replace_parent模板,为什么我使用
时它永远不起作用?你点击带有1和0的小按钮来突出显示你选择的。所以你认为问题发生在前两个“if”状态事件?我相信它不会出现在前两个if
s中。我正在查看最后一个else
,其中树仍然有子树;这是最坏的情况,但不幸的是最常见的情况。如果是最后一个else,它是我的replace\u父函数还是最后一个还需要更多编码?问题在于replace_parent。与当前正在执行的将每个元素向上移动一个元素不同,您需要沿着分支一直移动到底部,并将叶节点移动到顶部。否则,您的树可能会出现顺序混乱的风险。这怎么可能是一条一般规则?如果正确子树的最小值为1怎么办?那么您的方法将无法工作右子树的最小值永远不会小于根,因为它位于右子树中