2016-01-10 95 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; 
    }