二进制搜索树包含函数

时间:2013-10-24 21:29:53

标签: c++ exception binary-search-tree unhandled

我正在尝试为二叉搜索树编写“包含”函数。我在编译时收到以下错误“BST.exe中0x77291CB3(ntdll.dll)的未处理异常:0xC00000FD:堆栈溢出(参数:0x00000001,0x001E2FFC)。”以下是我的代码。

struct Node {
    int data;
    Node* leftChild;
    Node* rightChild;
    Node() : leftChild(NULL), rightChild(NULL) {}
};
struct BST {
    Node* root;
    BST() : root(NULL) {}
    void insert(int value);
    bool contains(int value);
};
void BST::insert(int value) {
    Node* temp = new Node();
    temp->data = value;
    if(root == NULL) {
        root = temp;
        return;
    }
    Node* current;
    current = root;
    Node* parent;
    parent = root;
    current = (temp->data < current->data ? (current->leftChild) : (current->rightChild)
    while(current != NULL) {
        parent = current;
        current = (temp->data < current->data) ? (current->leftChild) : (current->rightChild)
    }
    if(temp->data < parent->data) {
        parent->leftChild = temp;
    }
    if(temp->data > parent->data) {
        parent->rightChild = temp;
    }
}
bool BST::contains(int value) {
    Node* temp = new Node();
    temp->data = value;
    Node* current;
    current = root;
    if(temp->data == current->data) {  // base case for when node with value is found
        std::cout << "true" << std::endl;
        return true;
    }
    if(current == NULL) { // base case if BST is empty or if a leaf is reached before value is found
        std::cout << "false" << std::endl;
        return false;
    }
    else { // recursive step
        current = (temp->data < current->data) ? (current->leftChild) : (current->rightChild);
        return contains(temp->data);
    }
}
int main() {
    BST bst;
    bst.insert(5);
    bst.contains(4);
    system("pause");
}

就目前而言,我会插入一个值为'5'的单个节点,我会在二叉搜索树中搜索值为'4'的节点 - 因此,我希望结果为假。

1 个答案:

答案 0 :(得分:3)

currentcontains()函数中的局部变量。当函数被递归调用时,每个新调用都将获得它自己的局部变量集,并且不会看到外部函数对外部函数中的局部变量做了什么。

特别是,在递归调用之前,该函数将current节点设置为下一个应该搜索的节点。但被调用的函数永远不会看到current变量,它将获得自己的current变量,将其初始化为root,然后从那里开始搜索。

每个递归调用将从头开始搜索,然后再次调用自身,直到用完堆栈内存并导致堆栈溢出。

您应该将当前节点作为附加参数传递给current函数的递归调用,而不是设置contains()变量。

如果您不想更改contains()的参数,处理此问题的好方法可能是将实际工作转移到辅助函数,该函数处理附加参数:

bool BST::contains(int value) {
   return contains_rec(value, root);
}

bool BST::contains_rec(int value, Node *current) {
   ...
}

如果你制作了帮助函数private,你也可以确保没有人对它的存在感到困惑或者意外地调用它。

另一种可能性是完全避免递归并改为使用循环。