c++ - BST只能找到第一个节点

标签 c++ arrays search binary-search-tree

每个节点都有一个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;
}

谢谢你的时间

最佳答案

你的检索代码看起来不错,所以我会检查你的树构建代码。

此外,我不会混合使用 printfcout

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[]

编辑:对于leftright 应该如何工作,您的检索代码和树构建器代码似乎具有相反的含义。树生成器:

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/

相关文章:

c++ - 如何将矩阵因式分解为核矩阵的乘积?

被调用的对象 'strn' 不是一个函数

c++ - std::pair 作为映射中的键

c++ - 使用Win32 API时,要使用哪些数据类型?

c++ - 如何从 C++ 对 bat 文件执行命令

c++ - 在 longjmp/croak 之前显式调用析构函数

javascript - .each 不在数组上工作。但是 .isArray 返回 true?

java - 如何使用/返回 "public static String [] list={};"(来自amplify第3单元第29课的程序)

postgresql - 按具有不同优先级的两列排序 - Postgres

ruby-on-rails - 我将如何去搜索查询多个关联的用户?