2016-01-10 73 views
0

我正在写一个函数来插入节点BST,但得到分段错误。“插入到二进制搜索树中”出现分段错误。 #

/* 
    Node is defined as 

    typedef struct node 
    { 
    int data; 
    node * left; 
    node * right; 
    }node; 

    */ 

    node * findPos(node * tree, int value){ 
     if(tree -> data > value){ 
      return findPos(tree -> left, value); 
     } 
     else if (tree -> data < value){ 
      return findPos(tree -> right, value); 
     } 

     return tree; 
    } 

    node * addNode(int value){ 

     struct node * temp =(struct node *)malloc(sizeof(struct node)); 
     temp->data = value; 
     temp->left = NULL; 
     temp -> right = NULL; 
     return temp; 
    } 
    node * insert(node * root, int value) 
    { 
     node * ptr = root; 

     if(ptr == NULL) 
      return addNode(value); 

     else if(ptr -> data > value){ 
      ptr->left = findPos(ptr -> left, value); 
} 

     else if(ptr -> data < value){ 
      ptr->right = findPos(ptr -> right, value); 
     } 


     return root; 
    } 

我不能够了解哪些非法内存我试图访问它给这个错误。 请帮我这个。 感谢提前:)

+0

这是你学习如何使用调试器,这将让你直到分段故障发生时运行该程序的好机会,然后检查变量值等来诊断事情出错的地方。 –

+0

感谢Jim对此进行了跟进,我得到了错误,因为我没有在findPos()中处理这个情况,那个树可以是NULL。 –

+0

但是仍然逻辑不正确,试图找到,但没有得到任何东西。 –

回答

0

这里有两个问题:

  1. findPos应该处理,其中树是空的情况。
  2. 插入不应递归调用findPos。相反,它应该递归调用插入。像这样的东西(没有测试过):

    node * insert(node * root, int value) 
    { 
        node * ptr = root; 
        if(ptr == NULL) 
         return addNode(value); 
        else if(ptr -> data > value) { 
         return insert(ptr -> left, value); 
        } else if(ptr -> data < value) { 
         return insert(ptr -> right, value); 
        } else 
         return root; 
    } 
    
+0

NULL部分我明白了,并且我在我的评论中也提到过。即使逻辑有一些问题,我测试过的代码,它不工作。感谢后续。 –

0

感谢您的帮助家伙! 得到了节目工作

/* 
    Node is defined as 

    typedef struct node 
    { 
    int data; 
    node * left; 
    node * right; 
    }node; 

*/

node * addNode(int value){ 

    struct node * temp =(struct node *)malloc(sizeof(struct node)); 
    temp->data = value; 
    temp->left = NULL; 
    temp -> right = NULL; 
    return temp; 
    } 
    node * insert(node * root, int value) 
    { 
     node * ptr = root; 

    if(ptr == NULL) 
     return addNode(value); 

    else if(ptr -> data > value){ 
     ptr->left = insert(ptr -> left, value); 
    } 

    else if(ptr -> data < value){ 
     ptr->right = insert(ptr -> right, value); 
    } 


    return root; 
    }