C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: 二分探索


(過去ログ 131 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■77797 / inTopicNo.1)  二分探索
  
□投稿者/ pow (1回)-(2015/11/23(Mon) 19:46:01)

分類:[C/C++] 

以下は二分探索のプログラムです。
処理を上手く変えて、昇順で出力させるにはどうしたら良いですか?


#include<stdio.h>
#include<stdlib.h>

/*構造体を宣言する*/
struct node
{
int data;
struct node *left;
struct node *right;
};

void print_tree(struct node *p);

int main(void)
{
/*変数宣言*/
struct node *root,*tmp,*p;
int d,flg;

/*ツリーを初期化する*/
root = NULL;

/*最初のデータを入力する*/
printf("Input Number : ");
scanf("%d",&d);

while(d > 0)
{
/*要素を作成する*/
tmp = malloc(sizeof(struct node));
tmp->data = d;
tmp->left = NULL;
tmp->right = NULL;

if(root == NULL)
{
/*ルートにくっつける*/
root = tmp;
}
else
{
p=root;
flg = 0;

while(flg == 0)
{
if(tmp->data < p->data)
{
if(p->left == NULL)
{
/* 左にくっつける*/
printf("%dの左につけた\n",p->data);
p->left = tmp;
flg = 1;
}
else
{
p = p->left;
}
}
else
{
if(p->right == NULL)
{
printf("%dの右につけた\n",p->data);
p->right = tmp;
flg =1;
}
else
{
p = p->right;
}
}
}
}

/*次のデータを入力する*/
printf("Input Number : ");
scanf("%d", &d);

}

/*画面に出力する*/
printf("Result : ");
print_tree(root);
printf("\n");

return 0;
}


/*ツリーを出力する関数*/
void print_tree(struct node *p)
{
if(p != NULL)
{
/*自分自身を出力する*/
printf("%d",p->data);

/*左側を出力する*/
print_tree(p->left);

/*右側を出力する*/
print_tree(p->right);
}
}


引用返信 編集キー/
■77798 / inTopicNo.2)  Re[1]: 二分探索
□投稿者/ WebSurfer (715回)-(2015/11/23(Mon) 19:49:40)
No77797 (pow さん) に返信
> 以下は二分探索のプログラムです。
> 処理を上手く変えて、昇順で出力させるにはどうしたら良いですか?

学校の宿題とかですかね?
引用返信 編集キー/
■77799 / inTopicNo.3)  Re[2]: 二分探索
□投稿者/ pow (2回)-(2015/11/23(Mon) 20:05:36)
No77798 (WebSurfer さん) に返信
こんばんは。
ネットなどで二分探索の昇順がなかったので質問しました。
そうです。課題で質問しました。
よろしくお願いします。取り敢えず、普通の二分探索は仕上がったのですが。。
引用返信 編集キー/
■77804 / inTopicNo.4)  Re[1]: 二分探索
□投稿者/ しま (105回)-(2015/11/23(Mon) 20:39:51)
No77797 (pow さん) に返信
> 以下は二分探索のプログラムです。
> 処理を上手く変えて、昇順で出力させるにはどうしたら良いですか?
> 


こういうのは二分探索と呼ぶんでしたか?
node は二分木(樹)の構造ですよね?
普通、二分探索と呼ぶのはバイナリーサーチのことだから、順序良く(大きい順か小さい順かに)並んだ配列を
大きい方と、小さい方に分割して求める値を探す手法のことだと思いますが違いますか?

http://judge.u-aizu.ac.jp/onlinejudge/commentary.jsp?id=ALDS1_4_B
http://www.codereading.com/algo_and_ds/algo/binary_search.html

参考になりそうなのは、こことかどうでしょうか?
http://ufcpp.net/study/algorithm/col_tree.html
http://www.slideshare.net/iwiwi/2-12188757
http://ppp-lab.sakura.ne.jp/ProgrammingPlacePlus/algorithm/data_struct/007.html
http://ppp-lab.sakura.ne.jp/ProgrammingPlacePlus/algorithm/data_struct/008.html

scanf() や print_tree() では再帰を使っていますが、使い捨てのおもちゃで無い限り
scanf() は余りお勧めできません。
動作試験するにしても、ファイルから読む(データーを別途用意して)か、
プログラムにあらかじめ用意しておく方がいちいち入力しなくて済むので楽だと思いますよ。

あと、あなたが貼り付けたソースはインデントが無いのでとても読む気になりません。
インデントが反映できる、「図表モード」で次回からは投稿なさってください。

> #include<stdio.h>
> #include<stdlib.h>
>  
> /*構造体を宣言する*/
> struct node
> {
>     int data;
>     struct node *left;
>     struct node *right;
> };

引用返信 編集キー/
■77809 / inTopicNo.5)  Re[2]: 二分探索
□投稿者/ hoge (1回)-(2015/11/23(Mon) 23:34:32)
ツリー構造ですよね?
http://dixq.net/forum/viewtopic.php?f=3&t=17306&sid=b0bfb60769619839d18627b018f0ddd9

何度も名前を変えて投稿するのはどうかと…
関数化の方と一緒ですよね?
引用返信 編集キー/
■77810 / inTopicNo.6)  Re[3]: 二分探索
□投稿者/ WebSurfer (716回)-(2015/11/24(Tue) 00:44:34)
No77686 で指摘されてたマルチポストの人?
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -