好的,所以我有一个仅使用C结构和指针构建的二进制搜索树,因为我疯了而且不想使用C ++。无论如何,我有一些严重的内存泄漏,因为我 假设 free(tree)
,树是下面结构的一个实例,并没有释放所有的那棵树的孩子们。
这是我的节点:
struct node{
struct node* parent;
struct node* left;
struct node* right;
int key; //the value of the node
};
这是我的bst:
struct bst{
struct node* root;
int elements; //number of nodes in the bst
};
所以我的问题是,有没有比递归调用删除函数更好的方法呢?例如(当场写下):
void delete_tree(struct node* n){
if(n == NULL) return;
struct node* left = n->left;
struct node* right = n->right;
free(n);
delete_tree(left);
delete_tree(right);
}
答案 0 :(得分:5)
我认为递归删除绝对没有错。您可以使用迭代方法,但它不会有任何可辨别的好处,并且更难写。
顺便说一句,您可以稍微简化代码并删除两个局部变量:
void delete_tree(struct node* n){
if(n == NULL) return;
delete_tree(n->left);
delete_tree(n->right);
free(n);
}
答案 1 :(得分:2)
您正在进行递归调用但从未实际调用free
。您可能需要验证节点是否为叶节点(可能询问两个子节点是否为空)并在该节点上调用free
。