質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

1回答

4589閲覧

二分探索木の挿入について

cgengo

総合スコア12

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2017/12/21 13:56

編集2022/01/12 10:55

C言語
コード
#include<stdio.h>
#include<stdlib.h>
char buf[128];

struct student {int id; char name[32]; int score; };
typedef struct student datatype;
struct node{ datatype data; struct node *left,*right; };

struct node* get_tree(){
struct node t;
if(fgets(buf,sizeof(buf),stdin)==NULL||buf[0]=='.')
return NULL;
else{
t=(struct node
)malloc(sizeof(struct node));
sscanf(buf,"%d,%[^,],%d",&t->data.id,t->data.name,&t->data.score);
t->left=get_tree();
t->right=get_tree();
return t;
}
}

struct node* bst_insert(struct node t,struct student d){
/*ここが分からない
/
}

void print_bst(struct node *t){
if(t==NULL){
printf(".");
}else{
printf("%d,%s,%d",t->data.id,t->data.name,t->data.score);
print_bst(t->left);
print_bst(t->right);
}
}
int main(){
struct node *t=get_tree();
struct student d;
scanf("%d,%[^,],%d ",&d.id,d.name,&d.score);
t=bst_insert(t,d);
print_bst(t);
return 0;
}

͜この分からないとなっているところを埋めてほしいです。考えてもなかなかできないです。
ちなみにこのbst_insert関数は構造体nodeのアドレスtのさす節点を根とする二分探索木に構造体studentの値dをメンバdataとする節点を追加し得られた二分探索木の根の接点のアドレスを返す関数。

どなたかよろしくお願いします。参考にさせていただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2017/12/22 00:21

まず自分の書いた言葉を初心者にもわかりやすいよう説明してください。それからコードも # が抜けてインデントが無いので読みにくいです。初心者でも読めるよう丁寧にわかりやすく書いてください。
cgengo

2017/12/22 02:07

承知しました。後ほどそれぞれの関数に説明加えておきます。
Zuishin

2017/12/22 02:12

違います。熟練者用のコメントはいりません。まったく何も知らない初心者にわかりやすく丁寧に説明してください。
Zuishin

2017/12/22 02:31

もちろんインデントも入れて #include も直してください。
LouiS0616

2017/12/25 13:39

質問の内容を元に戻してください。
BlackEye

2017/12/28 13:02

この問題もつい最近大学で出題された問題と全く同じです。どのクラスかわかりませんが教授に報告しておきます。
guest

回答1

0

例だと、これに、

[100,A,1] / \ / \ [101,B,2] [103,D,4] / \ / \ / \ / \ [.] [102,C,3] [.] [.] / \ / \ [.] [.]

最後の「104,E,5」が追加されて、こうなるとのことですが、

[100,A,1] / \ / \ [101,B,2] [103,D,4] / \ / \ / \ / \ [.] [102,C,3] [.] [.] / \ / \ [.] [104,E,5] / \ / \ [.] [.]

bst_insert関数は構造体nodeのアドレスtのさす節点を根とする二分探索木に構造体studentの値dをメンバdataとする節点を追加し得られた二分探索木の根の接点のアドレスを返す関数。

この説明では、この関数(bst_insert)は二分木の根っこ(t)とstudentの値(d)を受け取って、二分木の何処かにstudentの値を追加して、新しい二分木の根っこを返すと言っています。
つまり、この説明には二分木の何処に値を追加するか書かれていません。

投稿2017/12/23 07:31

編集2017/12/23 07:36
hichon

総合スコア5737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cgengo

2017/12/23 11:01

この問には二分探索木(根の接点のアドレス)に構造体studentを追加する関数の作成を求められてるのですがどこにというのは問にも書かれていません。 二分探索木の根の接点のデータより追加するデータが小さい時は左の子の接点に移り大きい時は右の子の接点に移る。同様に移った先の節点のデータとの比較をし、それを繰り返して葉(NULL)にたどり着いたら追加するデータを含む新たな節点によってその葉を置き換えれば良いとのヒントしか書かれておりません。
hichon

2017/12/23 11:49

それだと「104,E,5」は「103,D,4」の右側に追加されるはずです。というか、問題としてはそれが自然のような気がします。
cgengo

2017/12/23 13:27

すみません、自分の解釈ミスでした。 入力が 103 100 . 101 . . 104 . . 102 とすると出力が 103 100 . 101 . 102 . . 104 . . となります(idのみ表示) なのでhichon様の解釈で正しいです
episteme

2017/12/24 22:11

> ...それを繰り返して葉(NULL)にたどり着いたら追加するデータを含む新たな節点によってその葉を置き換えれば良いとのヒントしか書かれておりません。 ヒントのとおりに実装すりゃいぃじゃん。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問