递归删除树的所有节点

时间:2018-07-08 14:22:45

标签: c recursion tree

/*
Recursively remove all nodes of the tree
*/
void dispose(node* root)
{
    if (root != NULL)
    {
        dispose(root->left);
        dispose(root->right);
        free(root);
    }
}

我不明白这段代码是如何删除整棵树的。

我看到的是它递归地到达左边的节点,直到到达空节点,然后再到达右边的节点,然后再继续向左走直到null,然后再右边,如果右边为null,则释放父节点。

似乎删除了树的最后一片叶子,而不是整个对象,

如果我弄错了,有人可以像我上面解释的那样解释代码的过程吗?

1 个答案:

答案 0 :(得分:1)

写出将在程序执行时进行的函数调用顺序很有帮助。这是一个示例树:

            A
    B               C
D       E       F       G

对于这棵树,函数调用的顺序为:

dispose(A)
    dispose(B)
        dispose(D)
            dispose(NULL)
            dispose(NULL)
            free(D)
        dispose(E)
            dispose(NULL)
            dispose(NULL)
            free(E)
        free(B)
    dispose(C)
        dispose(F)
            dispose(NULL)
            dispose(NULL)
            free(F)
        dispose(G)
            dispose(NULL)
            dispose(NULL)
            free(G)
        free(C)
    free(A)