C++ 从二进制搜索树中删除值

C++ 从二进制搜索树中删除值,c++,pointers,binary-tree,binary-search-tree,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) r

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

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;
}
模板
boolbstree::删除(常量键和键){
bool-removed=false;
Node*ptr=root;
如果(ptr==NULL)
移除返回;
while(键!=ptr){
如果(ptr==NULL)
移除返回;
否则如果(按键>ptr)
ptr=ptr->right();
其他的
ptr=ptr->left();
}
删除=真;
项目最大值=最大值(ptr);
ptr->data()=max;
节点*prev=ptr;
while(ptr!=NULL){
prev=ptr;
ptr=ptr->right();
}
删除ptr;
如果(上一个->左()!=NULL)
prev=复制(prev->left());
删除上一页;
移除返回;
}
Copy是我已经编写的另一个函数,它将使用递归方法将所有值从某个节点传输到树的末尾。我相信这个功能应该可以工作,但我不完全确定,并希望得到一些反馈


函数的最后三行也有问题。在每一个选项中,“if”、“delete”和“return”都有下划线,并给我一个错误“error:expected a declaration”。我不知道这是怎么回事,非常感谢您的反馈

嗯,我看到了一些事情

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

  • ptr->data()=max;我猜您的“data()”方法返回对项中成员的引用。没有错,只是感觉很奇怪

  • 您有两个“delete”语句,但您不应该只删除一项吗

  • 在本节中:

    while (ptr != NULL) {
    
        prev = ptr;
        ptr = ptr->right();
    }
    delete ptr;
    
    while退出后,ptr的值为NULL,因此您正在删除NULL,而不是cool


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