Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.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
C++ 二叉搜索树节点删除_C++_Binary Tree - Fatal编程技术网

C++ 二叉搜索树节点删除

C++ 二叉搜索树节点删除,c++,binary-tree,C++,Binary Tree,我一直在尝试为二叉搜索树实现一个delete函数,但未能使它在所有情况下都起作用 这是我的最新尝试: Node* RBT::BST_remove(int c) { Node* t = get_node(c); Node* temp = t; if(t->get_left() == empty) *t = *t->get_left(); else if(t->get_right() == empty) *t = *

我一直在尝试为二叉搜索树实现一个delete函数,但未能使它在所有情况下都起作用

这是我的最新尝试:

Node* RBT::BST_remove(int c)
{
    Node* t = get_node(c);
    Node* temp = t;

    if(t->get_left() == empty)
        *t = *t->get_left();
    else if(t->get_right() == empty)
        *t = *t->get_right();
    else if((t->get_left() != empty) && (t->get_right() != empty))
    {
        Node* node = new Node(t->get_data(), t->get_parent(), t->get_colour(), t->get_left(), t->get_right());
        *t = *node;
    }

    return temp;
}

Node* RBT::get_node(int c)
{
    Node* pos = root;

    while(pos != empty)
    {
        if(c < pos->get_data())
            pos = pos->get_left();
        else if(c == pos->get_data())
            return pos;
        else
            pos = pos->get_right();
    }

    return NULL;
}
Node*RBT::BST_remove(int c)
{
节点*t=获取节点(c);
节点*temp=t;
如果(t->get_left()==空)
*t=*t->get_left();
else if(t->get_right()==空)
*t=*t->get_right();
else if((t->get_left()!=empty)和&(t->get_right()!=empty))
{
Node*Node=新节点(t->get_data(),t->get_parent(),t->get_color(),t->get_left(),t->get_right());
*t=*节点;
}
返回温度;
}
Node*RBT::get_节点(int c)
{
节点*pos=根;
while(pos!=空)
{
如果(cget_data())
pos=pos->get_left();
else if(c==pos->get_data())
返回pos;
其他的
pos=pos->get_right();
}
返回NULL;
}
t是一个节点,而empty只是一个没有任何内容的节点

我只是想交换这些值,但是我得到了一个运行时错误。有什么想法吗

编辑:我将返回temp以在以后删除它


首先,谢谢你的最后一个条件子句,否则如果条件子句是多余的。用
else
子句交换它

其次,我认为如果将指向要删除的节点的指针作为参数,会使事情变得更容易。您可以编写一个
find()
函数,该函数将查找给定键的节点。当然,我假设您可以更改函数签名。如果可以将要删除的节点作为参数,则可以将重点放在删除节点上,而不是添加查找节点的逻辑。否则,仍然编写
find()
函数,并使用该函数获取指向相关节点的指针

删除二叉搜索树中的节点时,必须保持顺序,以便该树不会丢失其完整性。回想一下,树中有一个支持快速检索元素的特定顺序。因此,列举可能的案例:

  • 要删除的节点没有子节点。这很简单:只要释放它的资源,你就完成了
  • 该节点有一个子节点。这也相当简单。释放节点并将其替换为其子节点,以便子节点保留已移除节点在树中的位置
  • 该节点有两个子节点。让我们调用节点
    D
    。查找
    D
    的左子树最右边的子树。让我们调用这个节点
    R
    。将
    R
    的值分配给
    D
    ,然后删除
    R
    (如本算法所述)。请注意,
    R
    可以有零个或一个子项
  • 第三种情况如图所示:

             .
            .
           .
          /
         D
        / \
       /\  .
      /  \
     /    \
    +------+
            \
             R
            /
           ?
    

    如果问题是家庭作业问题,请将其标记为家庭作业。我假设我正在创建一个二元搜索树,因此我不太确定,但此树上的每个节点最多只能有两个子节点。您能否完整发布
    remove()
    函数?感谢您的回复,我已经更新了更多信息。我将在remove()中返回temp,然后在上面使用delete。谢谢,我现在已经解决了所有问题。我现在只需要担心把它转换成红黑树就行了。