- ベストアンサー
C言語の2分木探索について質問です
- C言語初心者の方が2分木探索について質問されています。
- 2分木構造体を使った総和を計算する関数の実装についての疑問があります。
- 再帰呼び出しを利用して総和を計算する方法が正しいかどうかについての意見を求めています。
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
No.6です。 > No.8様 同じ初心者の立場から言わせていただくと、まず2分木のデータを作成すること自体が難しいと思います。 少なくとも私はそうでした。 >トピ主様 私も勉強がてら、試してみました。 2分木作成関数と、mainのみ書いてみますのでご参考になれば幸いです。 Tree new_tree(int data, Tree left, Tree right){ Tree p; p = (Tree )malloc(sizeof(struct node)); p->data = data; p->left_subtree = left; p->right_subtree = right; return p; } int main(void){ Tree top, left, right, bottom; bottom = new_tree(3, NULL, NULL); right = new_tree(4, bottom, NULL); left = new_tree(5, NULL, NULL); top = new_tree(6, left, right); printf("sum = %d\n",sum_data(top)); // sum = 18 return 0; }
その他の回答 (9)
- asuncion
- ベストアンサー率33% (2127/6290)
>#9さん >2分木のデータを作成すること自体が難しい まあそりゃそうかもしれませんが、せっかく読み込み用の関数を作ったんだから、 書き込み用も作ってみようかなぁ、なんていう風に質問者さんには思ってほしいなぁ、 なんて思ったりしてるのです。 いちっばん肝心なところを人任せにしてると、いつまでたっても質問者さんの プログラミング能力は向上しないんじゃないかなぁ、なんて、老婆心ながら。 まあ、人のことだからどうでもいいっちゃいいんですけど。
お礼
プログラミングを学ぶ上で重要な姿勢を教えていただき、ありがとうございました。
- asuncion
- ベストアンサー率33% (2127/6290)
自分が作った関数の動きが正しいかどうか、他人にゆだねてどうするんでしょうね。 自分で動かそうとすることに興味がないのかな?
- asuncion
- ベストアンサー率33% (2127/6290)
>以下のように関数を作り直してみたのですが、これで良いのでしょうか? その関数を呼び出すmain関数などを書いて、動作確認してみればいいんじゃないでしょうか。
- siffon9
- ベストアンサー率64% (136/211)
私も初心者ですが回答させていただきますね。 > // 左分木、右分木のどちらも存在しなければ根節点の値を返す > if ((t->left_subtree == NULL) && (t->right_subtree == NULL)) 左分木と右分木のどちらか一方だけ存在した場合には対応できずエラーになります。 また、 > t->left_subtree の様に、引数のメンバのポインタをいきなり参照しているので、引数 tがNULLの場合には対応できません。 (NULLでないという保証があれば良いと思いますが) ですから、No.4さんの仰るように ・引数tがNULLだったら、0を返す ・そうでなければ、t->data + sum_data(t->left_subtree) + sum_data(t->right_subtree) を返す というのが良いのではないでしょうか。
補足
引数tはNULLでは無いという前提を書き忘れていました。申し訳ありません。 ご指摘いただいた内容を踏まえて、以下のように関数を作り直してみたのですが、これで良いのでしょうか? ■2分木内の節点に保持された整数データの総和を戻り値として返す関数 int sum_data(Tree t) { // 引数tがNULLならばゼロを返す if (t == NULL) { return 0; } else// そうでなけれは、左分木と右分木が存在するか確認する { return (t->data + sum_data(t->left_subtree) + sum_data(t->right_subtree)) } }
- asuncion
- ベストアンサー率33% (2127/6290)
>#4さん もとはと言えば、質問者さんのコードが中途半端であることが原因ですので、 我々(部外者)同士でもめることはやめておきましょうね。
- Tacosan
- ベストアンサー率23% (3656/15482)
むしろ「2分木の根節点のポインタ struct node *Tree を引数として与えられたとき」と書いてあるだけに困ったんだけど>#3. これだと Tree が引数の名前のように読める. struct node の宣言の前に typedef struct node *Tree; とあって, かつ上の「~」がもっと適切に書いてあれば明瞭なんだが. 「引数が NULL かどうか」でわけるという方針もありますね.
- asuncion
- ベストアンサー率33% (2127/6290)
>#2さん >せめて「Tree とはなんぞや」くらい書いてほしぃ.... >2分木の根節点のポインタ struct node *Tree って書いてあるように見えるんですが、目の錯覚でしょうか。
- Tacosan
- ベストアンサー率23% (3656/15482)
せめて「Tree とはなんぞや」くらい書いてほしぃ....
補足
説明不足ですいません。 Treeは構造体node型ポインタで、2分木の根節点(2分木の最上位)へのポインタが格納されています。 まだ不明点があれば、ご指摘願います。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
ここまで考えてんならやってみればいいのに。 # おそらくダメですけどね。 NULL参照が発生しますから。
お礼
丁寧な回答ありがとうございました。 2分木作成についてもご教授いただきありがとうございました。 他の回答者の方から指摘いただきましたが、 確かに自分でプログラムの動作確認をするという基本的なことをせずに、質問してしまったのは反省すべきだと思いました。次回からの教訓にしたいと思います。 ご回答頂いた皆様ありがとうございました。