Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Binary search tree 二叉搜索树-删除_Binary Search Tree - Fatal编程技术网

Binary search tree 二叉搜索树-删除

Binary search tree 二叉搜索树-删除,binary-search-tree,Binary Search Tree,我试图编写一个程序,接收字符串并按字母顺序将它们放在二元搜索树中。一旦这些字符串被插入到树中,用户会提示删除一个单词,从而从树中删除该节点,然后按顺序输出树而不返回该节点 在delete函数之前,一切都是这样的,delete函数确实可以工作,但是它删除的方式非常奇怪。我认为目前它删除了树的完整部分,因为当我删除最后一个单词时,它通常是有效的。我将上传我的删除功能,如果需要更多,我可以上传我的代码的其余部分 谢谢 template<typename T> void Delete(Tre

我试图编写一个程序,接收字符串并按字母顺序将它们放在二元搜索树中。一旦这些字符串被插入到树中,用户会提示删除一个单词,从而从树中删除该节点,然后按顺序输出树而不返回该节点

在delete函数之前,一切都是这样的,delete函数确实可以工作,但是它删除的方式非常奇怪。我认为目前它删除了树的完整部分,因为当我删除最后一个单词时,它通常是有效的。我将上传我的删除功能,如果需要更多,我可以上传我的代码的其余部分

谢谢

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怎么办?那么您的方法将无法工作右子树的最小值永远不会小于根,因为它位于右子树中