我无法使这棵树正常工作。我不断收到退出错误代码。这棵树是怎么回事,我将如何使用main中的搜索功能?看来方法编码正确,但我在main中没有正确使用它。我一直在获得不为0的退出错误,并且我没有尝试在主函数中使用的任何方法。现在我只是在输入以填充空间,因为显然我的帖子大部分是代码,而文本却不够!
//Binary Tree Practice
#include <iostream>
struct node{
int data;
node* right;
node* left;
};
class bTree{
public:
bTree(){
root=NULL;
}
~bTree(){
destroyTree();
}
void addNode(int key);
node *search(int key);
void destroyTree();
private:
node* root;
void addNode(int key,node*nod);
node *search(int key, node *leaf);
void destroyTree(node*&node);
};
node *bTree::search(int key)
{
return search(key, root);
}
void bTree::destroyTree()
{
destroyTree(root);
}
void bTree::addNode(int key)
{
if(root!=NULL)
addNode(key, root);
else
{
root=new node;
root->data=key;
root->left=NULL;
root->right=NULL;
}
}
void bTree::addNode(int key, node* nod) {//ADD a node in correct position.
if (key < nod->left->data) {
if (nod->left != NULL)
addNode(key, nod->left);//RECURSION traverse tree to the left until
find a NULL node
else {//When NULL node is found
nod->left = new node;
nod->left->data = key;
nod->left->left = NULL;
nod->right = NULL;
std::cout<<"node added"<<std::endl;
}
} else if (key > nod->right->data) {
if (nod->right != NULL)
addNode(key, nod->right);//RECURSIONTraverse right till find a null
node
else {//NULL node found
nod->right = new node;//Create new node
nod->right->data = key;//set NODE data to KEY
nod->right->right = NULL;
nod->left = NULL;
}
}
}
node *bTree::search(int key, node *leaf)
{
if(leaf!=NULL)
{
if(key==leaf->data)
return leaf;
if(key<leaf->data)
return search(key, leaf);
else
return search(key, leaf->right);
}
else return NULL;
}
void bTree:: destroyTree(node*&node){
if(node==NULL){
destroyTree(node->left);
destroyTree(node->right);
delete node;
}
}
int main() {
bTree *trees=new bTree();
trees->addNode(10);
trees->addNode(6);
trees->addNode(14);
node *check;
}
答案 0 :(得分:0)
具有签名 void bTree :: addNode(int key,node * nod)的addNode函数要做的第一件事是:
if (key < nod->left->data) {
您的代码的问题是,nod-> left会导致崩溃,因为左节点尚未初始化并导致未授权的内存访问,或者称为 segmentation fault 。让我们看一下主循环。
这是低级编程中的一个常见问题,我对您的建议是将调试打印内容放入函数中,以查看输入了哪些参数以及代码在何处崩溃。如果您可以精确地找到导致崩溃的路线(在这种情况下为nod-> left的路线),则将来可以更轻松地解决此类问题。
为了解决您的问题,只需确保在访问左右节点之前对其进行初始化。