递归BST查找元素不能很好地工作

时间:2014-01-08 19:53:54

标签: c

这是我在BST中搜索的功能:

BST* BSTFindElement(BST const *pTree, float find_value)
{
    if(pTree)
    {
        if(find_value > pTree->value)
            BSTFindElement(pTree->right, find_value);
        else if(find_value < pTree->value)
            BSTFindElement(pTree->left, find_value);
        return (BST*)pTree;
    }
    else
    {
        return 0;
    }
}

当浮点数不在树中时,会出现问题, 以任何方式返回(BST *)pTree。 我调试了,我注意到它确实运行良好,如果例如根是'3.6'并且我搜索了5它转到pTree-&gt;右边并搜索它,然后当它跳过 如果(pTree)它返回0但由于某种原因返回到顶部并再次返回(BST *)pTree ...我无法自己解决问题,任何人都可以帮助我?谢谢!

2 个答案:

答案 0 :(得分:2)

您正在寻找3.6并且ptree-&gt;值为5,所以你去了这里:

else if(find_value < pTree->value)
        BSTFindElement(pTree->left, find_value);

然后ptree为null所以你返回0,你回到上一个堆栈帧,我的意思是恰好在BSTFindElement(pTree-&gt; left,find_value)之后;而下一个陈述是

return (BST*)pTree;

这就是发生了什么,你返回ptree,破坏以前返回的0.如果你把它重写为:

else if(find_value < pTree->value)
        BSTFindElement(pTree->left, find_value);
else    
        return (BST*)pTree;

这仍然不应该解决所有问题。我想这会起作用

     if(find_value > pTree->value)
              **return** BSTFindElement(pTree->right, find_value);
    else if(find_value < pTree->value)
             **return** BSTFindElement(pTree->left, find_value);
    **else**
        return (BST*)pTree;

答案 1 :(得分:1)

似乎当查找值与pTree值不同时,您总是返回输入pTree。 您是否尝试过将代码更改为:

BST* BSTFindElement(BST const *pTree, float find_value){
if(pTree){
    if(find_value > pTree->value){
        return BSTFindElement(pTree->right, find_value);
    }
    else if(find_value < pTree->value){
        return BSTFindElement(pTree->left, find_value);
    }
    return (BST*)pTree;
}
else{
    return 0;
}