前提・実現したいこと
二分探索の深さを導くメソッドで深さが0になってしまいます。
発生している問題・エラーメッセージ
以下のプログラムのDepthメソッドを変更し、二分探索木の深さを出したいが、 深さが0と返されてしまう。
該当のソースコード
C言語
1+++++*+++++tree.c+++++*+++++ 2#include <stdio.h> 3#include <stdlib.h> 4#include <string.h> 5 6#define MAX_LEN 128 7typedef enum { 8 Term,Insert,Search,Print 9} Menu; 10 11typedef struct _bnode { 12 char name[MAX_LEN]; 13 struct _bnode *left; 14 struct _bnode *right; 15 int count; 16} BinNode; 17 18BinNode *AllocNode(void) 19{ 20 BinNode *tmp; 21 22 tmp = (BinNode *)calloc(1,sizeof(BinNode)); 23 tmp->count = 1; 24 return(tmp); 25} 26 27BinNode *ApndNode(BinNode *p, BinNode *w) 28{ 29 int cond; 30 if (p == NULL) { 31 p = AllocNode(); 32 strcpy(p->name,w->name); 33 p->left = p->right = NULL; 34 } 35 else if((cond = strcmp(w->name,p->name))==0) { 36 p->count++; 37 } 38 else if (cond < 0) p->left = ApndNode(p->left,w); 39 else p->right = ApndNode(p->right,w); 40 return p; 41} 42 43void SrchNode(BinNode *p, BinNode *w) 44{ 45 int cond; 46 if (p == NULL) 47 printf("%s is not registered\n",w->name); 48 else if((cond = strcmp(w->name,p->name))==0) 49 printf("%s is registered\n",w->name); 50 else if (cond < 0) 51 SrchNode(p->left,w); 52 else 53 SrchNode(p->right,w); 54} 55 56void PrintTree(BinNode *p) 57{ 58 if (p != NULL) { 59 PrintTree(p->right); 60 printf("%s(%d)\n",p->name,p->count); 61 PrintTree(p->left); 62 } 63} 64 65void FreeTree(BinNode *p) 66{ 67 if (p != NULL) { 68 FreeTree(p->left); 69 FreeTree(p->right); 70 free(p); 71 } 72} 73 74BinNode Read(char *message) 75{ 76 BinNode temp; 77 printf("Please Input name for %s:",message); 78 scanf("%s",temp.name); 79 return (temp); 80} 81 82Menu SelectMenu(void) 83{ 84 int ch; 85 do { 86 printf("(1)Insert (2)Search (3) Print (0)Quit:"); 87 scanf("%d",&ch); 88 } while(ch < Term||ch > Print); 89 return ((Menu)ch); 90} 91 92int Depth(BinNode *p, int depth) 93{ 94// 95 96if(p != NULL) { 97int depthL; 98int depthR; 99depthL = Depth(p->left, depth++); 100depthR = Depth(p->right, depth++); 101 102return (depthL>=depthR) ? depthL : depthR; 103} 104 105 106 107 108} 109 110int main(void) 111{ 112 Menu menu; 113 BinNode *root; 114 115 int depth; 116 117 // ルートノードを深さ0とするため 118 depth = -1; 119 120 root = NULL; 121 122 do { 123 BinNode x; 124 switch (menu = SelectMenu()) { 125 case Insert :x = Read("Insert"); 126 root = ApndNode(root,&x);break; 127 case Search: x = Read("Search"); 128 SrchNode(root,&x); break; 129 case Print: puts("----------------"); 130 PrintTree(root); 131 } 132 } while (menu != Term); 133 printf("max_depth=%d\n",Depth(root,depth)); 134 FreeTree(root); 135 return(0); 136} 137//
試したこと
Depthメソッドを次のように変更したりもしました。(以下に記載)
int Depth(BinNode *p, int depth)
{
//
if(p != NULL) {
int depthL;
int depthR;
depthL = Depth(p->left, depth);
depthR = Depth(p->right, depth);
return (depthL>=depthR) ? depthL : depthR;
}
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。