【问题标题】:BST only first node can be foundBST 只能找到第一个节点
【发布时间】:2013-12-13 00:33:15
【问题描述】:

每个节点都有一个数据和含义数组,左右指针。并且,看起来像添加了第二个节点(我通过打印计数知道),但是当我搜索它时,没有结果。另外,如果我尝试添加更多节点。

主要

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 函数:_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;
}

感谢您的宝贵时间

【问题讨论】:

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


    【解决方案1】:

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

    另外,我不会混用 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);
    

    您需要翻转一个以匹配另一个。我的偏好是翻转构建器,使左指针小于父节点,父节点小于右节点。

    【讨论】:

    • 感谢 Joe 让我的代码更短,但我确信树的构建是正确的,因为我有一个显示功能,可以打印所有节点。
    • 抱歉,将生成器中的更改语句更改为 (strcmp(newPtr->data,node->data)left = addword(newPtr,node ->左);和节点正确它成为一个运行时错误!感谢您的耐心等待!我的心被炸了
    • @Beginner:当您更改构建器时,您需要做的就是将参数的顺序更改为strcmp。除此之外,我不知道该告诉你什么。也许在你的if 语句的“then”和“else 子句中添加打印语句,以显示你的递归步骤你的代码正在做出的决定。
    • 哦,我忘记在编辑后关闭括号。真的不知道怎么感谢你!
    猜你喜欢
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多