実行すると
「トップノードの値を入力してください。20
ノード[20:深さ0]の左の子の値を入れてください。15
ノード[20:深さ0]の右の子の値を入れてください。40
ノード[15:深さ1]の左の子の値を入れてください。11
ノード[15:深さ1]の右の子の値を入れてください。18
ノード[11:深さ2]の左の子の値を入れてください。/
ノード[18:深さ2]の左の子の値を入れてください。17
ノード[18:深さ2]の右の子の値を入れてください。/
・
が表示されて2分木のデータを作成するプログラムを作りたいのです。絵で表すと、
20
/ \
15 40
/ \ /\
11 18 30 55
/ /\ \
17 25 33 61
のようになります(なんか絵がずれて表示される)。
一応、自分で考えてみたのですが
#include<stdio.h>
#include<malloc.h>
struct data
{ int kazu;
struct data *left;
struct data *right;
};
main()
{
struct data *root,*p;
root=(struct data *)malloc(sizeof(struct data));
printf("トップノードの値を入れてください:");
scanf("%d",root->kazu);
root->left=root->right=NULL;
while(1){
p=(struct data *)malloc(sizeof(struct data));
printf("ノード%d,深さ%dの左の子の値を入れてください",root->kazu,
scanf("%d", );
printf("ノード%d,深さ%dの右の子の値を入れてください",root->kazu,
scanf("%d", );
if(
break;
なんか全然良くわからないのです。アルゴリズムの本を見て勉強していて、データ構造は理解できたのですが、2分木(グラフ)で詰まってしまいました。
小さい順に数を表示させるとか、そういうのじゃなくて、単にデータを格納するだけです。どうかよろしくお願いします。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
ご質問そのものに答える前に、2分木の作り方について少々考えてみます。
2分木は、データを登録する順序を変えるだけで、全く違った構成になることは明白です。
従って、2分木の登録のやり方自体が、この例では、(他にも色々あるとしても)例えば、20、15、11、18、17、40、30、25、33、55、61の順で登録すれば題意の2分木が出来るのです。これが通常の2分木の作成方法です。
ご質問にあるように、何番のノードの右下に何番と言うような作り方は普通しないと思います。
あと、疑問点を少々(補足下さい)
(1)文章とノードの図でノードの数が違う。
(2)「/」の使われているところと使われていないところがある。
No.2
- 回答日時:
数年ぶりにこういうものを作ってみたくなり、作ってみました。
参考程度にとどめて置いてください。一応動くとは思いますが、検証してません。入力部分は関数化した方がよいですが、本題と関係ないのでそのままです。struct data
{
int kazu;
struct data *left;
struct data *right;
};
charbuf[32];
main()
{
struct data *root;
root = (struct data*)malloc(sizeof(struct data));
root->left = NULL;
root->right = NULL;
printf ("Input node of top >");
scanf ("%d", &root->kazu);
cur = root;
btree(root, 0);
}
btree (struct data *cur, int depth)
{
printf ("node %d depth %d left >", cur->kazu, depth);
scanf ("%s", buf);
if (buf[0] == '/') {
cur->left = NULL;
} else {
cur->left = (struct data*)malloc(sizeof (struct data));
cur->left->kazu = atoi(buf);
}
printf ("node %d depth %d right >", cur->kazu, depth);
scanf ("%s", buf);
if (buf[0] == '/') {
cur->right = NULL;
} else {
cur->right = (struct data*)malloc(sizeof (struct data));
cur->right->kazu = atoi(buf);
}
if (cur->left) {
btree (cur->left, depth + 1);
}
if (cur->right) {
btree (cur->right, depth + 1);
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
昔Winnyってありましたけど、あ...
-
CPUの考え方を教えてください ...
-
SNMP リンクダウンとノードダ...
-
C#初心者です。HtmlAgilityPack...
-
木のなぞり順をかえるプログラ...
-
グラフ色塗り問題のプログラミ...
-
ツリービューのノードをダブル...
-
2分探索木の高さを求めるプロ...
-
2分木と双方向線形リストを同時...
-
同じタグ名の項目取得
-
東芝のDynabookなのですがアン...
-
タグの有無の判定
-
Dreamweaver CS3 : シングルク...
-
XML、XSLTの適応エラー(IEから...
-
XMLで要素が記述された順番に意...
-
重複するものを消したい
-
XMLのスタイルシートで単独タグ...
-
xsl:param要素をxsl:templateの...
-
xml→htmlへの変換&ページ分割...
-
C#で使用中のファイルに別のフ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CPUの考え方を教えてください ...
-
昔Winnyってありましたけど、あ...
-
SNMP リンクダウンとノードダ...
-
ルート要素ノードが2個ある場合?
-
同じタグ名の項目取得
-
あるノードリストに、特定の名...
-
ノードとは
-
TreeView の初期表示について
-
ツリービューのノードをダブル...
-
ノード数とは?
-
コンテキストメニュークリック...
-
XML文書の指定した属性値を持つ...
-
C#でtreeviewの指定ノードを選...
-
複数のマックPCによる数値計算...
-
VB6.0ツリービューについて
-
TreeViewの再表示のちらつきを...
-
VB6.0でDOMを使用して...
-
vbsのDOMDocumentで要素のText...
-
TreeViewで複数ノードの選択は...
-
C# TreeView 効率良いノード追...
おすすめ情報