每个节点都有一个data&meaning数组,右指针和左指针。而且,看起来添加了第二个节点(我通过打印计数知道),但是当我搜索它时,没有结果。另外,如果我尝试添加更多节点。
主要
BST tree;
char sw[10];
char A[ ]={"BST"};
char Am[ ]={"Binary Search Tree"};
tree.maketree(A,Am);
char B[ ]={"COM"};
char Bm[ ]={"commerce"};
tree.maketree(B,Bm);
cout<<"Search: ";
string inputword;
cin>>inputword;
strcpy(sw, inputword.c_str());
tree.BST_Retrieve(sw);
检索函数:_retrieve 如果找到则返回节点,BST_Retrieve 打印含义
NODE* _retrieve (char key[],NODE*node)
{
if (node)
{
if (strcmp(key,node->data)<0)
return _retrieve (key, node->left);
else if (strcmp(key,node->data)>0)
return _retrieve (key, node->right);
else
return (node);
}
else
return NULL;
}// _retrieve
bool BST_Retrieve (char key[])
{
NODE *node;
if (! root)
return false;
node = _retrieve (key,root);
if (node)
{
printf("%s",node->meaning);
cout<<endl;
node=node->right;
if (node) {
cout<<"\nNext word is: ";
printf("%s",node->data);
}
return true;
}
else
return false;
}
谢谢你的时间
最佳答案
你的检索代码看起来不错,所以我会检查你的树构建代码。
此外,我不会混合使用 printf
和 cout
。
cout << node->meaning << endl;
和
cout << "Next word is: " << node->data << endl;
会做的很好。
其他建议:
strcpy(sw, inputword.c_str());
tree.BST_Retrieve(sw);
可以安全地缩短为:
tree.BST_Retrieve( inputword.c_str() );
因为您没有尝试存储 c_str
返回的指针。但是,您必须更改方法以采用 const char *key
而不是 char key[]
。
编辑:对于left
和right
应该如何工作,您的检索代码和树构建器代码似乎具有相反的含义。树生成器:
if (strcmp(node->data,newPtr->data)<0)
node->left = addword(node->left,newPtr);
如果 node
小于 newPtr
,这将向左递归。这与树递归的作用相反:
if (strcmp(key,node->data)<0)
return _retrieve (key, node->left);
你需要翻转一个来匹配另一个。我的偏好是翻转构建器,使左指针小于父节点,父节点小于右节点。
关于c++ - BST只能找到第一个节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20557062/