在二叉搜索树中删除C ++(树不会更新)和堆损坏

时间:2012-02-07 16:14:24

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

我正在尝试为二叉树编写节点删除。这些是我的节点和树结构:

class node{
public:
    int value;
    node* left;
    node* right;
    ~node();
};

class tree{
public:
    node* root;
    ....
};

这是我写的功能:

void tree::del(node** r, int x){
if(*r)
{
    if((*r)->value==x)
    {
        if(!(*r)->left)
            *r= (*r)->right;
        else if(!(*r)->right)
            *r= (*r)->left;
        else 
        {
            int k= delMax((*r)->left);
            (*r)->value= k;
        }
    }
    else if((*r)->value > x)
    {
        node* k= (*r)->left;
        del(&k, x);
    }
    else
    {
        node* k= (*r)->right;
        del(&k, x);
    }
}}

我的问题是,一旦我到达了所需的元素,指针就会改变,但是当树被递归地重建时,它会回到原来的状态而没有删除任何元素。我以为传递指针指针会解决这个问题,但事实并非如此。 delMax从树中删除最大元素,它可以自行正常工作。

另外,在最后两个类的析构函数中,我应该如何放置删除?因为如果我只是删除权利;删除左;在~node()并删除~tree()中的根我收到错误,我正在破坏堆。

谢谢!

1 个答案:

答案 0 :(得分:0)

通过创建局部变量k并传递地址,通过*r进行的赋值会影响局部变量,而不是中的任何指针树。

顺便说一句,写node *&r可以为您节省几个&*