如何使用双指针释放树结构?

时间:2018-09-04 09:22:55

标签: c pointers tree double-pointer

我必须释放一棵树,并使用特定函数将其根设置为NULL。我试图使用回话法。但是,如果我进行编译,则会收到有关“不兼容的指针类型”的警告,而我无法解决它。这是结构:

typedef struct node {
int key; 
struct node *left, *mid, *right;
} node_t;

这里是函数。第一行不能更改:

void free_tree (node_t ** root){
if(root != NULL){
    free_tree((*root)->left);
    free_tree((*root)->mid);
    free_tree((*root)->right);
    free(*root);
    }
return;
}

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

您的问题不能很清楚地回答,但至少我可以告诉您为什么对incompatible pointer type发出警告:

您的函数原型是

void free_tree (node_t ** root);

它的参数是node_t **

您的结构是

typedef struct node {
    int key; 
    struct node *left, *mid, *right;
} node_t;

所以在您的函数中:

void free_tree (node_t ** root)
{
    if(root != NULL)
    {
        free_tree((*root)->left);   <<< '(*root)->left' is of type 'node_t *'
        free_tree((*root)->mid);    <<< '(*root)->mid' is of type 'node_t *'
        free_tree((*root)->right);  <<< '(*root)->right' is of type 'node_t *'
        free(*root);
    }
    return;
}

您称您的函数使用node_t *作为参数,而您的函数期望使用node_t **

答案 1 :(得分:1)

您的函数需要一个指向节点的指针。您在递归调用中为它提供了三次指向节点的指针。此外,您并没有验证其指向的指针为非空;您只是在验证前者。

简而言之,您的函数应如下所示:

void free_tree (node_t ** root)
{
    if(root && *root)
    {
        free_tree(&(*root)->left);
        free_tree(&(*root)->mid);
        free_tree(&(*root)->right);
        free(*root);
        *root = NULL;
    }
}

最后一个功能行是可选的,但是坦率地说,除非使用了指针指向指针的功能,否则这样做毫无意义,因为它会在清除树后将调用者的指针设置为NULL。给定一棵正确构建的树,当破坏整个树时,调用者应提供树根的地址,如下:

node_t *root = NULL;

// ... build tree ...

free_tree(&root);

// root is now NULL; tree is destroyed