
C言語初心者です。
2分木構造体
struct node{
int data;
Tree left_subtree;
Tree right_subtree;
}
を上記のように定義した場合、
2分木の根節点のポインタ struct node *Tree を引数として与えられたとき、
2分木内の節点に保持された整数データの総和を戻り値として返す関数 int sum_data(Tree t);を再帰呼び出しで作成してみたのですが、正しいでしょうか?
■2分木内の節点に保持された整数データの総和を戻り値として返す関数
int sum_data(Tree t)
{
// 左分木、右分木のどちらも存在しなければ根節点の値を返す
if ((t->left_subtree == NULL) && (t->right_subtree == NULL))
{
return t->data;
}
else// どちらか存在していれば再帰呼び出しする
{
return (t->data + sum_data(t->left_subtree) + sum_data(t->right_subtree))
}
}
ご指摘ありましたら、お願いしますm(_ _)m
No.9ベストアンサー
- 回答日時:
No.6です。
> No.8様
同じ初心者の立場から言わせていただくと、まず2分木のデータを作成すること自体が難しいと思います。
少なくとも私はそうでした。
>トピ主様
私も勉強がてら、試してみました。
2分木作成関数と、mainのみ書いてみますのでご参考になれば幸いです。
Tree new_tree(int data, Tree left, Tree right){
Tree p;
p = (Tree )malloc(sizeof(struct node));
p->data = data;
p->left_subtree = left;
p->right_subtree = right;
return p;
}
int main(void){
Tree top, left, right, bottom;
bottom = new_tree(3, NULL, NULL);
right = new_tree(4, bottom, NULL);
left = new_tree(5, NULL, NULL);
top = new_tree(6, left, right);
printf("sum = %d\n",sum_data(top)); // sum = 18
return 0;
}
丁寧な回答ありがとうございました。
2分木作成についてもご教授いただきありがとうございました。
他の回答者の方から指摘いただきましたが、
確かに自分でプログラムの動作確認をするという基本的なことをせずに、質問してしまったのは反省すべきだと思いました。次回からの教訓にしたいと思います。
ご回答頂いた皆様ありがとうございました。
No.10
- 回答日時:
>#9さん
>2分木のデータを作成すること自体が難しい
まあそりゃそうかもしれませんが、せっかく読み込み用の関数を作ったんだから、
書き込み用も作ってみようかなぁ、なんていう風に質問者さんには思ってほしいなぁ、
なんて思ったりしてるのです。
いちっばん肝心なところを人任せにしてると、いつまでたっても質問者さんの
プログラミング能力は向上しないんじゃないかなぁ、なんて、老婆心ながら。
まあ、人のことだからどうでもいいっちゃいいんですけど。
No.6
- 回答日時:
私も初心者ですが回答させていただきますね。
> // 左分木、右分木のどちらも存在しなければ根節点の値を返す
> if ((t->left_subtree == NULL) && (t->right_subtree == NULL))
左分木と右分木のどちらか一方だけ存在した場合には対応できずエラーになります。
また、
> t->left_subtree
の様に、引数のメンバのポインタをいきなり参照しているので、引数 tがNULLの場合には対応できません。
(NULLでないという保証があれば良いと思いますが)
ですから、No.4さんの仰るように
・引数tがNULLだったら、0を返す
・そうでなければ、t->data + sum_data(t->left_subtree) + sum_data(t->right_subtree) を返す
というのが良いのではないでしょうか。
この回答への補足
引数tはNULLでは無いという前提を書き忘れていました。申し訳ありません。
ご指摘いただいた内容を踏まえて、以下のように関数を作り直してみたのですが、これで良いのでしょうか?
■2分木内の節点に保持された整数データの総和を戻り値として返す関数
int sum_data(Tree t)
{
// 引数tがNULLならばゼロを返す
if (t == NULL)
{
return 0;
}
else// そうでなけれは、左分木と右分木が存在するか確認する
{
return (t->data + sum_data(t->left_subtree) + sum_data(t->right_subtree))
}
}
No.4
- 回答日時:
むしろ「2分木の根節点のポインタ struct node *Tree を引数として与えられたとき」と書いてあるだけに困ったんだけど>#3. これだと Tree が引数の名前のように読める.
struct node の宣言の前に
typedef struct node *Tree;
とあって, かつ上の「~」がもっと適切に書いてあれば明瞭なんだが.
「引数が NULL かどうか」でわけるという方針もありますね.
No.3
- 回答日時:
>#2さん
>せめて「Tree とはなんぞや」くらい書いてほしぃ....
>2分木の根節点のポインタ struct node *Tree
って書いてあるように見えるんですが、目の錯覚でしょうか。
お探しの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# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語 3 2022/10/04 15:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
int型(2バイト)データの分割
-
C言語の構造体にてバブルソート...
-
エクセルVBA:日付データの変換...
-
C++/CLIのオブジェクト型配列
-
画像処理のチェーンコード
-
stable diffusionのエラー
-
VisualBasicでレジストリキーの...
-
aliasesファイルを検索したいの...
-
pythonでDBのカラム名で取得し...
-
参照渡しの速度について
-
構造体の初期化の時にポインタ...
-
エクセルVBAで16の16乗を正確に...
-
Perlで取得した情報をFlashへ渡す
-
perlチェックでエラーが出て困...
-
C#でのswitch文
-
音声波形の数値表示用のソフト
-
UTF-8で5~6バイトになる文字コ...
-
10Mバイトて文字数に すると何...
-
COBOLのCOMP形式について
-
DataGridViewの特定列に入力さ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
stable diffusionのエラー
-
エクセルVBA:日付データの変換...
-
【Excel VBA】10進数を2進数に...
-
int型(2バイト)データの分割
-
Excel VBA グラフ作成のとき...
-
C#でのswitch文
-
'dataType' 引数を Null にする...
-
linuxのシェルでファイル名に先...
-
printfの%eで指数部分の桁数を...
-
ポインター引数の関数でコンパ...
-
CreateProcessでの環境変数の設...
-
C言語でのLinuxとwindows共通の...
-
C言語でPBYTE型からDOUBLE型へ変換
-
pythonでDBのカラム名で取得し...
-
エクセルVBAで16の16乗を正確に...
-
FFTがうまくできない
-
ビットデータのチェック方法
-
参照渡しの速度について
-
POSTで配列のデータを渡す方法は?
-
PINVOKEで構造体配列をマーシャ...
おすすめ情報