为什么这段代码片段会给我一个分段错误?

时间:2014-03-30 23:28:59

标签: c++ recursion segmentation-fault binary-tree binary-search-tree

我正在编写一个二叉搜索树,这个名为Search的函数接受一个值x并搜索树中的节点并返回它是否是一个叶子。

bool search(Node<T>* &currentNode, const T& x) const
{
    //~ cout << "CURRENT NODE DATA: " << currentNode->data << "   :   ";


    /*  FUNCTION: Searches for variable that is passed in X and checks if this value is a leaf or not */

    //Left Subtree Search
    if (x < binTree<T>::root->data)
    {
    if ((leaf(currentNode)) == true)
        { 
          return true;
        }
    else 
    {
    search(currentNode->left, x);   
    }

    }


//Right Subtree Search
else if (x >= binTree<T>::root->data)
{
    //If node in right subtree is a node check 
    if ((leaf(currentNode)) == true)
    {
        return true;
    }   

    else 
    {
    search(currentNode->right, x);
    }

}


 //Return false if the node is not a leaf
 return false;

}  //END OF SEARCH FUNCTION


bool leaf(Node<T>* currentNode) const 
{
    return ((currentNode->left == nullptr && currentNode->right == nullptr) ? true : false);        
}

当我使用新的更新节点递归调用搜索功能时,会发生seg错误。二叉树初始化为100个值,并从根开始搜索。

2 个答案:

答案 0 :(得分:0)

你必须申报
    bool leaf(Node<T>* currentNode) const
之前搜索

在搜索功能之前轻松修复,复制并粘贴bool leaf(Node<T>* currentNode) const;

答案 1 :(得分:0)

此代码

if (x < binTree<T>::root->data)

正在检查root,请注意currentNode,因此测试永远不会改变。因此,如果您的x值小于root->data,您将继续尝试通过currentNode->left递归,直到您遇到一片叶子(如果幸运的话)或者您点击了一个留空的节点指针,在这种情况下,您将currentNode递归为NULL,这会在leaf尝试检查currentNode->left时导致段错误

您应该检查currentNode。您还应该返回search递归调用的返回值