• ベストアンサー

C言語のプログラムを教えてください

二分木を使って正の整数の和を計算するプログラムがわかりません。どなたか教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • keikan
  • ベストアンサー率42% (75/176)
回答No.3

スコープの問題があるので、グローバルな変数を宣言して、void treewalk(struct treenode *p)内のprintfのところあたりでそのグローバル変数に加算していけばいいと思いますが?できませんか?^^

asdew
質問者

お礼

グローバル変数というのを用いてできました! ありがとうございました。

その他の回答 (2)

  • hpsk
  • ベストアンサー率40% (48/119)
回答No.2

ほとんど完成していますね。 あとは、ノードの値を足し合わせてreturnするコードを追加するだけです。 treewalkの返り値をint(=ノードの数値の合計)として、 (木の合計) = (左の部分木の合計) + (自分のノード) + (右の部分木の合計) と考え、以下のように修正すればいいです。 int treewalk(struct treenode *p) { if(p!=NULL) return (treewalk(p->left) + p->value + treewalk(p->right)); else return 0; }

asdew
質問者

お礼

完成しました。 ありがとうございました

  • edomin
  • ベストアンサー率32% (327/1003)
回答No.1

質問の意味がよくわかりません。 「ここまで出来たけど、うまく動かない・・・」等を示しましょう。 ですが、もしかして http://santamartadotnet.hp.infoseek.co.jp/documents/cpp/polish.html みたいなこと?

参考URL:
http://santamartadotnet.hp.infoseek.co.jp/documents/cpp/polish.html
asdew
質問者

補足

説明不足ですいません。二分木にデータ(正の整数)を格納し、それらの和を求めるプログラムです。 二分木にデータを格納し、すべてのノードを訪問してそれらを足し合わせるという方向で考えています。参考書を見て、考えたプログラムを示しておきます。 このプログラムでは、 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))); }

関連するQ&A