我正在尝试为二叉搜索树编写“包含”函数。我在编译时收到以下错误“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'的节点 - 因此,我希望结果为假。
答案 0 :(得分:3)
current
是contains()
函数中的局部变量。当函数被递归调用时,每个新调用都将获得它自己的局部变量集,并且不会看到外部函数对外部函数中的局部变量做了什么。
特别是,在递归调用之前,该函数将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
,你也可以确保没有人对它的存在感到困惑或者意外地调用它。
另一种可能性是完全避免递归并改为使用循环。