从二叉搜索树中删除值

时间:2012-12-05 02:08:36

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

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

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

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

我也遇到了函数最后三行的问题。在每个中,“if”,“delete”和“return”都带有下划线,并给出错误“错误:预期声明”。我不知道这是怎么回事,真的很感激反馈!

1 个答案:

答案 0 :(得分:0)

恕我直言,我看到了一些事情。

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

  2. ptr-&gt; data()= max;我猜你的“data()”方法返回对Item中成员的引用。没错,只是感觉很奇怪。

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

  4. 在本节中:

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

    while退出后,ptr的值为NULL,因此您删除的是NULL,而不是很酷。