我正在尝试为二叉树编写节点删除。这些是我的节点和树结构:
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()
中的根我收到错误,我正在破坏堆。
谢谢!
答案 0 :(得分:0)
通过创建局部变量k
并传递其地址,通过*r
进行的赋值会影响局部变量,而不是中的任何指针树。
顺便说一句,写node *&r
可以为您节省几个&
和*
。