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

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

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

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

1回答

1096閲覧

二分探索木構造について

grape_ll

総合スコア83

C

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

1クリップ

投稿2020/10/05 13:44

編集2020/10/06 07:26

C言語で二分探索木を実装しました.
ここで内部道長を,木の内部節点のレベルの総和とします.また,根のレベルを0とします.このとき,以下のようなコードを書いたのですが,~~これはうまく実装できているでしょうか.~~結果が正しいものとはなりませんでした.1~10を昇順で入れたときには総和は45になると思うのですが42と表示されています.これは再帰のどこが原因で発生しているのでしょうか.
いくつかのファイルを用いて行っています.
実行した結果をコードの下に載せます.

C

1#include <stdlib.h> 2#include<stdio.h> 3#include "Item.h" 4typedef struct STnode* link; 5struct STnode { 6Item item; link l, r; int N; 7}; 8static link head, z; 9link NEW(Item item, link l, link r, int N){ 10 link x = malloc(sizeof *x); 11 x->item = item; x->l = l; x->r = r; x->N = N; 12 return x; 13} 14void STinit(){ 15 head = (z = NEW(NULLitem, 0, 0, 0)); 16} 17int STcount(void) { 18 return head->N; 19} 20Item searchR(link h, Key v){ 21 Key t = key(h->item); 22 if (h == z) return NULLitem; 23 if eq(v, t) return h->item; 24 if less(v, t) return searchR(h->l, v); 25 else return searchR(h->r, v); 26} 27Item STsearch(Key v) { 28 return searchR(head, v); 29} 30link insertR(link h, Item item){ 31Key v = key(item), t = key(h->item); 32 if (h == z) return NEW(item, z, z, 1); 33 if less(v, t) 34 h->l = insertR(h->l, item); 35 else h->r = insertR(h->r, item); 36 (h->N)++; return h; 37} 38void STinsert(Item item){ 39 head = insertR(head, item); 40} 41int ipathR(link h){ 42 if(h == NULL) return 0; 43 else return 2 + ipathR(h->l) + ipathR(h->r); 44} 45 46int STipathlength(){ 47return ipathR(head); 48} 49

C

1#include <stdio.h> 2#include <stdlib.h> 3#include "Item.h" 4#include "ST.h" 5 6int main(int argc, char *argv[]) 7{ int N, M, maxN = atoi(argv[1]), sw = atoi(argv[2]); 8 Key v; Item item; 9 STinit(maxN); srand(1); 10 for (M = 0, N = 0; N < maxN; N++) 11 { 12 if (sw == 1) v = ITEMrand(); 13 else if (sw == 2) v = N+1; 14 else if (ITEMscan(&v) == EOF) break; 15 item = STsearch(v); if (item.key != NULLitem.key) continue; 16 key(item) = v; 17 STinsert(item); M++; 18 } 19 int INlength = STipathlength(); 20 printf("ipathlength:%d\n",INlength); 21 return 0; 22} 23

##実行結果
./ST 30 1
41 153 292 491 2995 3902 4827 5436 5705 6334 9961 11478 11942 12382 14604 15724 16827 17421 18467 18716 19169 19718 19895 23281 24464 26500 26962 28145 29358 32391
ipathlength:122

./STtest 10 2
1 2 3 4 5 6 7 8 9 10
ipathlength:42

##追記

C

1int ipathR(link h){ 2 if(h == NULL) return 0; 3 else { 4 printf("%d %d\n",ipathR(h->l),ipathR(h->r)); 5 return 1 + ipathR(h->l) + ipathR(h->r); 6 } 7} 8 9int STipathlength(){ return ipathR(head); }

関数の中を以下のようにしてどのような値で動いているのかを見たのですが結果が以下のようになってしまい,
0 0
がなぜこんなに多く表示されるのかわからないです.

(結果)
./STtest 2 2
0 0
0 0
1 1
0 0
0 0
0 0
1 3
0 0
0 0
0 0
1 1
0 0
0 0
ipathlength:5

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

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

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

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

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

fana

2020/10/06 01:29 編集

・意味不明. 「うまく実装」とは何か? その完結すらしてなさそうなコード断片から他者に何を判断しろと要求しているのか? ・「実行した結果」とやらがあるのならば,そこから勝手に「うまいかどうか」を判断すればよろしいのでは? (・あとこれは個人的意見だが,コードが汚すぎて見たくもない.)
grape_ll

2020/10/06 05:45

こちらの説明がよくないようですね.申し訳ございません. うまいというのは,結果が正しい=うまく実装できている,と勝手に定義していました. includeしているものを提示しようか迷ったのですが,ただファイルが多くなって見づらくなるだけになるそうだと勝手に判断してしまいました.個人的には再帰のところさえ見れば,プログラミングに強い方なら本質が見抜けると思っていたので,この張り付けたファイルには他にもいろいろ書いていたのですが本題とは関係ないと思い省かせていただきました. 結果は出せているのですが,自分の確認だけでは安心には足らないと判断したので投稿させていただいてます. コードの汚さについては,これから改善したいと思います.
fana

2020/10/06 06:12

そもそも質問内容が何なのかわからなかった → 質問内容が明確になったようなので,プログラミングに強い方であれば回答可能な状態になったのかもしれません.
grape_ll

2020/10/06 06:29

ご指摘ありがとうございました。これからも質問する際には内容をできる限り明確にするようにしたいと思います.
guest

回答1

0

自己解決

int ipathR(link h,int p){
if(h == z) return 0;
else{
return p + ipathR(h->l,p+1) + ipathR(h->r,p+1);
}
}
このようにすることで出来ました.

投稿2020/10/10 06:40

grape_ll

総合スコア83

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問