OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

再帰処理について

  • すぐに回答を!
  • 質問No.181007
  • 閲覧数175
  • ありがとう数4
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 53% (7/13)

以下のソースコードを用いて二分木を生成して、それをトラバーサルすると
昇順に表示されますが!
これを、用いて全ての節の子を(左の子と右の子)を交換する。
関数定義
void ReverseTree( struct BTREE *ptr);
を再帰的呼び出しによって実現してのですが!
どう考えればよいのでしょうか?
さらに、2分木の生成後に入力した整数値がリスト中にあるかどうかを
判定し、(存在すれば1、存在しなければ、0を関数値とする)
関数定義 int ExistTest(struct BTREE *ptr, searchdata);
を作成し動作を確認したいのですが!
ご教授して下さい。お願いします.
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.2
レベル14

ベストアンサー率 50% (1122/2211)

「再帰だ」ってるのに、あほうですね、私。枝の処理を忘れてました。

それを直せたのだから、検索も簡単でしょう。

TraverseTree() が全てのノードを処理しているのに対し、検索はひとつでも
見つかれば、1を返せばよいのですから。

(1) 自分がその値であるか? そうなら、1を返しておしまい
(2) 無ければ、左にあるか? あれば、1を返しておしまい
(3) 無ければ、右にあるか? あれば、1を返しておしまい
(4) どこにもないので、0を返す

蛇足かもしれませんが、

>     } else if (ExistTest(ptr->left, searchdata)) {

と書いたのは

} else if (ExistTest(ptr->left, searchdata) != 0) {

と全く同じことです。
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.1
レベル14

ベストアンサー率 50% (1122/2211)

TraverseTree() をじっと見れば、さほど難しくないと思うのだけどなあ。 > 全ての節の子を(左の子と右の子)を交換する。 void ReverseTree(struct BTREE *ptr) {   if (ptr == NULL) {     return;   } else {     struct BTREE* tmp;     tmp = ...続きを読む
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;
    }
  }
}

# コンパイルや動作確認をしたわけではないので、自信無しです
補足コメント
naguma

お礼率 53% (7/13)

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);
}
}

入れ替えとトラバーサルを行えばできました。
ありがとうございます。
検索は、奮闘中です.
投稿日時 - 2001-12-08 01:22:20
お礼コメント
naguma

お礼率 53% (7/13)

入れ替えはワークを使用して入れ替えるのですが、
全ての節を行うには、という点がわかりません。
投稿日時 - 2001-12-08 01:13:14
このQ&Aのテーマ
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ