在C++中实现二叉搜索树,搜索不起作用.尝试打印节点的元素会导致输出崩溃

Implementing Binary Search Tree in C++, search does not work. Trying to print the elements of the node causes output to crash

本文关键字:元素 节点 打印 崩溃 输出 实现 C++ 搜索树 不起作用 搜索      更新时间:2023-10-16

>我正在尝试在C++中实现二叉搜索树。这是我写的代码。当我尝试搜索它们时给出一些输入后,除了根节点的值之外,输出在每种情况下都显示为"false"。当我尝试检查循环是否正确匹配节点中的值时,程序崩溃了。但是,如果不打印,程序只会输出负数而不会崩溃。我在这里搞砸了哪里?

#include<iostream>
using namespace std;
struct tree {
int data;
tree* left;
tree* right;
};
class BST{
public:
tree* rootTreeNode = NULL;
tree* createNode(int incomingData){
tree* newNode = new tree();
newNode->data = incomingData;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
void insert(tree* RootAddress, int DataToInsert){
if(RootAddress == NULL) {
if(rootTreeNode == NULL) {
rootTreeNode = createNode(DataToInsert);
}
else {
RootAddress = createNode(DataToInsert);
}
} else if(DataToInsert > RootAddress->data) {
insert(RootAddress->right, DataToInsert);
} else if(DataToInsert <= RootAddress->data) {
insert(RootAddress->left, DataToInsert);
}
}

bool search(tree* rootAdd, int dataToSearch){
if(rootAdd == NULL) {
return false;
}
else if(rootAdd->data == dataToSearch){
return true;
}
else if(dataToSearch > rootAdd->data ){
search(rootAdd->right, dataToSearch);
}
else if(dataToSearch <= rootAdd->data){
search(rootAdd->left, dataToSearch);
}
return false;
}

void disp(){
tree * curr = rootTreeNode;
while(1){
cout << curr->data <<endl;
int ch;
cout << "Enter 1 for left and 2 for right" <<endl;
cin >> ch;
if(ch == 1){
curr = curr->left;
}else if(ch == 2){
curr = curr->right;
} else if(ch == 3){
break;
}
}
}
};


int main() {
BST BinartSearchTree;
while(1) {
int c;
cout << "Enter (1) to insert a value.nEnter (2) to search value.nEnter (3) to Check the tree.n.=> ";
cin >> c;
if(c == 1){
int input;
cout << "Enter your Data: ";
cin >> input;
BinartSearchTree.insert(BinartSearchTree.rootTreeNode, input);
} else if(c==2){
int x;
bool result;
cout << "Enter element you wanna search: ";
cin >> x;
result = BinartSearchTree.search(BinartSearchTree.rootTreeNode, x);
if(result) {
cout << "The given data Exists in the treenn";
} else {
cout <<"The Data ain't in the treenn";
}
} else if(c==3){
BinartSearchTree.disp();
}

}
}

in

void insert(tree* RootAddress, int DataToInsert)

tree* RootAddress按值传递。"等一下!"你说。"那是指针公子!!指向的tree(如果有的话)是通过引用传递的,但指针本身...只是一个副本。

这意味着

RootAddress = createNode(DataToInsert);

将新tree分配给副本。源tree不知道副本现在指向其他地方。

溶液:

void insert(tree* & RootAddress, int DataToInsert)

通过引用传递指针。

下一个

search(rootAdd->right, dataToSearch);

search返回的值不执行任何操作 无论是否找到该值,该函数都落入到

return false;

并且始终为超过第一个节点的任何节点返回 false。不是很有用。

溶液:

bool search(tree* rootAdd, int dataToSearch){
if(rootAdd == NULL) {
return false;
}
else if(rootAdd->data == dataToSearch){
return true;
}
else if(dataToSearch > rootAdd->data ){
return search(rootAdd->right, dataToSearch);
}
else if(dataToSearch < rootAdd->data){
return search(rootAdd->left, dataToSearch);
}
}

其他注意事项:

void disp()

不检查以确保迭代不会离开树的末尾。在cout << curr->data <<endl;之前,必须进行currNULL的测试。

此外,树迭代的指导将使调试变得异常烦人。如果这是课堂作业的一部分,请与教师核实这是否是他们真正想要的。如果这是出于您自己的邪恶目的,那么通过实现一种常见的遍历算法并打印整个列表可能会更好地为您服务。

考虑将tree* createNode(int incomingData)替换为合适的Tree构造函数

tree(int incomingData): data(incomingData), left(nullptr), right(nullptr)
{
}

或聚合初始化

rootTreeNode = new tree{DataToInsert, nullptr, nullptr};

我认为你可能在搜索函数的第三个"else"中存在错误的不等式: else if(dataToSearch>= rootAdd->data){ search(rootAdd->left, dataToSearch);