/*=======================================================================* * 2分木を扱う再帰関数の例 2023.8.10 山田俊行 * *=======================================================================*/ /* * このファイルは,tree.h や (実装済みの) tree.c のあるディレクトリに保存し, * 次のコマンドでコンパイル・実行する. * * gcc tree.c recursion.c -o recursion * ./recursion */ #include <stdio.h> #include "tree.h" /*----- 木の大きさ (節の総数) を再帰的に計算 -----*/ int size(const Tree *t) { if (t == NULL) return 0; else return (size(t->left) + size(t->right) + 1); } /*----- 木の大きさの再帰計算の様子を表示 -----*/ int compute_size(const Tree *t, int depth) { int i, size; /* 関数の開始直後,節情報を表示 */ for (i = 1; i <= depth; i++) printf("> "); if (t == NULL) printf("[#]\n"); else printf("[%c]\n", t->node); /* 節数の計算本体 */ if (t == NULL) size = 0; else size = compute_size(t->left, depth + 1) + compute_size(t->right, depth + 1) + 1; /* 関数の終了直前,部分木の大きさを表示 */ for (i = 1; i <= depth; i++) printf("> "); printf("size = %d\n", size); return size; } /*----- 木を表す文字列,木の節数,節数の再帰計算の過程 を順に表示 -----*/ int main(void) { Tree *t = branch('+', /* a*b + c/d を表す木 */ branch('*',leaf('a'),leaf('b')), branch('/',leaf('c'),leaf('d')) ); printf("t = "); show_tree(t); printf("size(t) = %d\n", size(t)); printf("computation of size(t) :\n"); compute_size(t, 0); free_tree(t); t = NULL; return 0; }