在C++中实现二叉搜索树,搜索不起作用.尝试打印节点的元素会导致输出崩溃
Implementing Binary Search Tree in C++, search does not work. Trying to print the elements of the node causes output to crash
>我正在尝试在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;
之前,必须进行curr
不NULL
的测试。
此外,树迭代的指导将使调试变得异常烦人。如果这是课堂作业的一部分,请与教师核实这是否是他们真正想要的。如果这是出于您自己的邪恶目的,那么通过实现一种常见的遍历算法并打印整个列表可能会更好地为您服务。
和
考虑将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);
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 反向给定链表中的K节点
- 为什么将函数的返回类型从结构节点*更改为void后,链表的元素没有显示create_ll和显示?
- 如何在给定特定节点的BST中找到直接较大的元素
- 在C++中实现二叉搜索树,搜索不起作用.尝试打印节点的元素会导致输出崩溃
- 嵌套的C 常数数据结构,没有初始化列表或明确命名所有节点-VC 2012过早破坏了内部元素
- 使用 CDT 从头文件中获取属性定义的节点元素是什么
- 如何使用libxml2从C 中的XML文件中检索节点和特定元素字符串而不使用XPATH
- 如何使用XPath使用libxml2从C 中的XML文件中检索节点和特定元素字符串
- 忽略GSOAP中的未知XML元素节点
- 链表只打印添加新节点后的最后一个元素
- 尝试将元素添加到现有节点时程序崩溃
- 如何使用队列从C++中的每个节点中搜索元素
- 如何在二叉搜索树节点中查找次要元素的平均值
- 为什么我的打印函数不会显示链表任一子节点中的元素?
- std::列出元素删除后节点的内存回收
- 对包含多个元素的节点的链表进行排序
- std::list如何分配节点和元素
- 遍历以向量和映射作为其第二个节点的映射,并在第二个节点的第二个元素中找到匹配项。C++
- 如何重命名boost属性树中的节点/元素