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
回答1件
あなたの回答
tips
プレビュー