我怎样才能使这棵树正常工作?

时间:2019-01-25 17:43:40

标签: recursion data-structures tree binary binary-tree

我无法使这棵树正常工作。我不断收到退出错误代码。这棵树是怎么回事,我将如何使用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;


}

1 个答案:

答案 0 :(得分:0)

具有签名 void bTree :: addNode(int key,node * nod)的addNode函数要做的第一件事是:

if (key < nod->left->data) {

您的代码的问题是,nod-> left会导致崩溃,因为左节点尚未初始化并导致未授权的内存访问,或者称为 segmentation fault 。让我们看一下主循环。

  1. addNode(10)-调用带有签名 void bTree :: addNode(int key)的addNode函数,root为null,因此将左右节点设置为NULL来创建root。 / li>
  2. addNode(6)-调用带有签名 void bTree :: addNode(int key)的addNode函数,root不为null,因此带有签名 void bTree :: addNode( int键,则节点* nod)被调用。然后点头->离开,然后崩溃。

这是低级编程中的一个常见问题,我对您的建议是将调试打印内容放入函数中,以查看输入了哪些参数以及代码在何处崩溃。如果您可以精确地找到导致崩溃的路线(在这种情况下为nod-> left的路线),则将来可以更轻松地解决此类问题。

为了解决您的问题,只需确保在访问左右节点之前对其进行初始化。