2017-04-15 49 views
-1

我基本上試圖在我的樹中插入一個數字。最初我傳遞命令insert(root,10),然後我的函數遞歸遍歷樹插入值。遍歷正常,但我的樹不會更新。我已經通過構造函數在此類中構建了一棵樹。在插入函數爲{0,1,2,3,4,5,6,7,8,9}之前,我的樹的順序遍歷以及在插入之後的相同遍歷爲什麼這個插入函數不會更新我的二叉搜索樹?

我的插入功能:

private: 

node* root 

void insert(node* ptr, int num) { 
      if (ptr == NULL) { 
        ptr = new node; 
        ptr->data = num; 
        ptr->left = NULL; 
        ptr->right = NULL; 
        return; 
      } 

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

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

我的類的私有成員創建初始樹

node* createTree(int array[], int start, int end) { 

      if(start > end) { 
        return NULL; 
      } 

      int mid; 
      node* newNode = new node; 

      if (((start + end) % 2) != 0) { 
        mid = ((start + end)/2) + 1; 
      } 

      else { 
        mid = (start + end)/2; 
      }  

      newNode->data = array[mid]; 
      newNode->left = createTree(array, start, mid - 1); 
      newNode->right = createTree(array, mid + 1, end); 

      cout << newNode->data << " " << newNode << endl; 

      return newNode; 
    } 

構造

BST(int array[], int length) { 
      root = createTree(array, 0, length - 1); 
    } 
+0

顯示'node'的聲明將有所幫助。見[mcve]。 – nwp

+2

如果'ptr'是'nullptr',你將分配一個新的'node',然後泄漏內存,因爲'insert'返回後新的'node'不可訪問。 – nwp

+0

那麼我應該如何去解決這個問題呢?我是新來的編碼和這個網站。我覺得自己喜歡在這個網站上投票,而不是幫助他們投票選舉新人。 – aashman

回答

0

你需要確保當你分配一個新的節點父被更新。一種方法是讓插入返回節點指針:

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

謝謝!那工作。我最初嘗試在該函數中傳遞一個指向節點的指針,但我想我忘了做一些事情。 – aashman