【问题标题】:Removing a value from a binary search tree从二叉搜索树中删除一个值
【发布时间】:2012-12-05 02:08:35
【问题描述】:

我正在编写一个函数,该函数将从具有关联给定键的二叉搜索树中删除一个条目。到目前为止,我的代码有这个:

template <typename Item, typename Key = Item>
bool BSTree<Item,Key>::remove(const Key& key) {
    bool removed = false;
    Node* ptr = root;
    if(ptr == NULL)
        return removed;
    while(key != ptr) {
        if(ptr == NULL)
            return removed;
        else if(key > ptr) 
            ptr = ptr->right();
        else
            ptr = ptr->left();
    }
    removed = true;
    Item max = max(ptr);
    ptr->data() = max;
    Node* prev = ptr;
    while (ptr != NULL) {
        prev = ptr;
        ptr = ptr->right();
    }
    delete ptr;
    if (prev->left() != NULL) 
        prev = copy(prev->left());
    delete prev;
    return removed;
}

Copy 是我已经编写的另一个函数,它将使用递归方法将所有值从某个节点传输到树的末尾。我相信这个功能应该可以工作,但我不完全确定,希望能得到一些反馈。

函数的最后三行也有问题。在它们中的每一个中,“if”、“delete”和“return”都带有下划线,并给出错误“错误:预期声明”。我不知道这是怎么回事,非常感谢您的反馈!

【问题讨论】:

  • 它们在“while(key != ptr)”中的类型是否相同?
  • 是的。通过使用键对函数进行模板化,您可以根据节点检查给定键,因为已经实现了正确的运算符。
  • 我明白了,您正在重载运算符 != 来比较 Key 和 Node*

标签: c++ pointers binary-tree binary-search-tree


【解决方案1】:

恕我直言,我看到了几件事。

  1. 对于 BST 移除,您需要一种更好的移植方法,而不是“复制”,至少您应该找到与要移除的节点相比下一个最小的节点。

  2. ptr->data() = max;我猜您的“data()”方法返回对 Item 中成员的引用。没有错,就是感觉怪怪的。

  3. 您有两个“删除”语句,但您不应该只删除一项吗?

  4. 在本节中:

    while (ptr != NULL) {
    
        prev = ptr;
        ptr = ptr->right();
    }
    delete ptr;
    

    while 退出后,ptr 的值为 NULL,所以你是在删除一个 NULL,不爽。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 2015-04-08
    相关资源
    最近更新 更多