- ベストアンサー
C言語のプログラムを教えてください
二分木を使って正の整数の和を計算するプログラムがわかりません。どなたか教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
スコープの問題があるので、グローバルな変数を宣言して、void treewalk(struct treenode *p)内のprintfのところあたりでそのグローバル変数に加算していけばいいと思いますが?できませんか?^^
その他の回答 (2)
- hpsk
- ベストアンサー率40% (48/119)
ほとんど完成していますね。 あとは、ノードの値を足し合わせてreturnするコードを追加するだけです。 treewalkの返り値をint(=ノードの数値の合計)として、 (木の合計) = (左の部分木の合計) + (自分のノード) + (右の部分木の合計) と考え、以下のように修正すればいいです。 int treewalk(struct treenode *p) { if(p!=NULL) return (treewalk(p->left) + p->value + treewalk(p->right)); else return 0; }
お礼
完成しました。 ありがとうございました
- edomin
- ベストアンサー率32% (327/1003)
質問の意味がよくわかりません。 「ここまで出来たけど、うまく動かない・・・」等を示しましょう。 ですが、もしかして http://santamartadotnet.hp.infoseek.co.jp/documents/cpp/polish.html みたいなこと?
補足
説明不足ですいません。二分木にデータ(正の整数)を格納し、それらの和を求めるプログラムです。 二分木にデータを格納し、すべてのノードを訪問してそれらを足し合わせるという方向で考えています。参考書を見て、考えたプログラムを示しておきます。 このプログラムでは、 void treewalk(struct treenode *p)の関数で通りがけ順で全てのノードを訪問しています。この部分を書き換えてなんとかしようとしているのですが、どうもできません・・・。よろしくお願いします。 #include<stdio.h> #include<malloc.h> struct treenode{ int value; struct treenode *left, *right; }; struct treenode *talloc(void); struct treenode *gentree(struct treenode *p, int *data); void treewalk(struct treenode *p); void main(void) { struct treenode *root; int data; root=NULL; while(scanf("%d", &data)!=EOF){ root=gentree(root, &data); } treewalk(root); } void treewalk(struct treenode *p) { if(p!=NULL){ treewalk(p->left); printf("%d\n", p->value); treewalk(p->right); } } struct treenode *gentree(struct treenode *p, int *data) { if(p==NULL){ p=talloc(); p->value=*data; p->left=p->right=NULL; } else if(p->value > *data){ p->left=gentree(p->left, data); } else { p->right=gentree(p->right, data); } return p; } struct treenode *talloc(void) { return ((struct treenode *)malloc(sizeof(struct treenode))); }
お礼
グローバル変数というのを用いてできました! ありがとうございました。