2026-09-13
free_tree.c
#include <stdlib.h>
struct node {
int value;
struct node *left;
struct node *right;
};
void free_tree(struct node *t) {
// write this: free every node of the tree rooted at t
// (t may be NULL, meaning an empty tree)
}
すべてのノードがmallocで確保された二分木を、1つ残らずfreeするfree_treeを再帰で実装してください。
Reference
void free_tree(struct node *t) {
if (t == NULL)
return;
free_tree(t->left);
free_tree(t->right);
free(t);
}
空の木(NULL)を基底にし、左の部分木、右の部分木を片付けてから最後に自分をfreeします(後行順)。順番が本質で、先にfree(t)してしまうと、その後のt->leftは解放済みメモリの読み出しになります。ループで書こうとすると「まだ片付けていない子」を覚えておく自前のスタックが必要ですが、再帰なら呼び出しスタックがそれを持ってくれるので、木の定義(「空」か「値と2つの部分木」)をそのまま4行に写すだけで済みます。なおfree(NULL)は何もしないと規定されているので、NULLチェックを子の側で行う書き方もありえます。これは参考実装であり、唯一の正解ではありません。