【问题标题】:Binary Search Tree node removal二叉搜索树节点移除
【发布时间】:2010-04-04 18:40:31
【问题描述】:

我一直在尝试为二叉搜索树实现删除功能,但无法让它在所有情况下都能正常工作。

这是我最近的尝试:

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;
}

t 是一个节点,而 empty 只是一个没有任何内容的节点。

我只是想交换值,但遇到运行时错误。有什么想法吗?

编辑:我将返回 temp 以在之后将其删除。

谢谢

【问题讨论】:

  • 如果是作业问题,请将问题标记为作业。
  • 我假设我正在制作一个二叉搜索树,所以我不太确定,但是这棵树上的每个节点最多可以有两个孩子。
  • 能否请您完整发布remove() 函数?
  • 感谢到目前为止的回复,我已经更新了一些信息。我在 remove() 中返回 temp,然后在其上使用 delete。

标签: c++ binary-tree


【解决方案1】:

首先,您的最后一个else if 条件子句是多余的。用else 子句交换它。

其次,如果您将指向要删除的节点的指针作为参数,我认为这会让您更轻松。您可以编写一个find() 函数,该函数将在给定其键的情况下找到一个节点。我当然假设您可以更改函数签名。如果您可以将要删除的节点作为参数,您可以专注于删除节点,而不是添加查找节点的逻辑。否则,仍然编写 find() 函数并使用它来获取指向相关节点的指针。

当您删除二叉搜索树中的节点时,您必须保持顺序,以免树失去其完整性。回想一下,树中有一个支持快速检索元素的特定排序。所以,列举可能的情况:

  1. 要删除的节点没有子节点。这很简单:只需释放其资源即可。
  2. 该节点有一个子节点。这也相当简单。释放节点并用其子节点替换它,因此子节点在树中保留已删除节点的位置。
  3. 节点有两个子节点。我们将节点称为D。找到D 的左子树最右边的孩子。我们称这个节点为R。将R 的值赋值给D,并删除R(如本算法所述)。请注意,R 可以有零个或一个孩子。

第三个场景,如图所示:

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

【讨论】:

  • 谢谢,我已经搞定了。我现在只需要担心将其转换为红黑树删除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-11
  • 1970-01-01
相关资源
最近更新 更多