释放C中的链接结构

Gre*_*ynn 0 c free struct memory-management data-structures

好的,所以我有一个只使用C结构和指针构建的二进制搜索树,因为我疯了,不想使用C++.无论如何,我有一些严重的内存泄漏,因为我假设 free(tree),树是下面结构的一个实例,并没有释放那棵树的所有孩子.

这是我的节点:

struct node{
    struct node* parent;
    struct node* left;
    struct node* right;
    int key; //the value of the node
};
Run Code Online (Sandbox Code Playgroud)

这是我的bst:

struct bst{
    struct node* root;
    int elements; //number of nodes in the bst
};
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,有没有比递归调用删除函数更好的方法呢?例如(在现场写这篇文章):

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);
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 5

我认为递归删除绝对没有错.您可以使用迭代方法,但它不会有任何明显的好处,并且会更难写.

顺便说一句,您可以稍微简化代码并删除两个局部变量,如下所示:

void delete_tree(struct node* n){
    if(n == NULL) return;
    delete_tree(n->left);
    delete_tree(n->right);
    free(n);
}
Run Code Online (Sandbox Code Playgroud)

  • 我确定还有其他方法,我只是没有看到他们为什么会更好的任何特殊原因.这很容易正确编写,这对我来说是一个很大的优点. (2认同)
  • @Greg顺便说一句,如果你在递归调用delete_tree之后编写了free,那么你就不需要那些讨厌的本地人了 - 请看我的更新 (2认同)