- ベストアンサー
再帰処理について
- 再帰処理を用いた二分木の生成とトラバーサル
- 全ての節の子を交換する再帰的な処理方法
- 指定した整数値の存在判定を行う関数の作成
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
「再帰だ」ってるのに、あほうですね、私。枝の処理を忘れてました。 それを直せたのだから、検索も簡単でしょう。 TraverseTree() が全てのノードを処理しているのに対し、検索はひとつでも 見つかれば、1を返せばよいのですから。 (1) 自分がその値であるか? そうなら、1を返しておしまい (2) 無ければ、左にあるか? あれば、1を返しておしまい (3) 無ければ、右にあるか? あれば、1を返しておしまい (4) どこにもないので、0を返す 蛇足かもしれませんが、 > } else if (ExistTest(ptr->left, searchdata)) { と書いたのは } else if (ExistTest(ptr->left, searchdata) != 0) { と全く同じことです。
その他の回答 (1)
- a-kuma
- ベストアンサー率50% (1122/2211)
TraverseTree() をじっと見れば、さほど難しくないと思うのだけどなあ。 > 全ての節の子を(左の子と右の子)を交換する。 void ReverseTree(struct BTREE *ptr) { if (ptr == NULL) { return; } else { struct BTREE* tmp; tmp = ptr->left; ptr->left = ptr->right; ptr->right = tmp; } } > 2分木の生成後に入力した整数値がリスト中にあるかどうかを int ExistTest(struct BTREE *ptr, int searchdata) { if (ptr == NULL) { return 0; } else { if (ptr->data == searchdata) { return 1; } else if (ExistTest(ptr->left, searchdata)) { return 1; } else if (ExistTest(ptr->right, searchdata)) { return 1; } else { return 0; } } } # コンパイルや動作確認をしたわけではないので、自信無しです
お礼
入れ替えはワークを使用して入れ替えるのですが、 全ての節を行うには、という点がわかりません。
補足
void ReverseTree (struct BTREE *ptr) { struct BTREE *workp; if(ptr == NULL){ return; }else{ workp = ptr->left; ptr->left = ptr->right; ptr->right = workp; ReverseTree (ptr->left); ReverseTree (ptr->right); } } 入れ替えとトラバーサルを行えばできました。 ありがとうございます。 検索は、奮闘中です.