2017-04-15 80 views
1

所以我寫了這個代碼插入節點BST(二進制搜索樹),但程序總是打印樹是空的。我想我的功能調用有問題。你能解釋一下這個問題嗎?此代碼用於BST插入有什麼問題?

#include <bits/stdc++.h> 
    #include <conio.h> 
    using namespace std; 

    struct node 
    { 
     int key; 
     node* left; 
     node* right; 
    }; 


    void insert(node* root, int item) 
    { 
     if(root == NULL) 
     { 
      node* temp = new node(); 
      temp->key = item; 
      temp->left = NULL; 
      temp->right = NULL; 
      root = temp; 
     } 
     else 
     { 
      if((root->key)>item) 
      { 
       insert(root->left,item); 
      } 
      else 
      { 
       insert(root->right,item); 
      } 
     } 
    } 

    void inorder(node* root) 
    { 
     if(root!=NULL) 
     { 
      inorder(root->left); 
      cout<<" "<<root->key<<" "; 
      inorder(root->right); 
     } 
     else cout<<"The tree is empty."; 
    } 

    int main() 
    { 
     // cout<<endl<<" Here 5 "; 
     node* root = NULL; 
     int flag = 1 , item; 
     while(flag == 1) 
     { 
      cout<<"Enter the number you want to enter : "; 
      cin>>item; 
      // cout<<endl<<" Here 6"; 
      insert(root, item); 
      cout<<"Do you want to enter another number (1 -> YES)?"; 
      cin>>flag; 
     } 
     cout<<"The final tree is :"; 
     inorder(root); 
     getch(); 
     return 0; 
    } 
+0

你有未初始化的指針'node * root;'。除非您爲其賦值,否則它不會設置爲NULL。 –

+0

我將它改爲NULL。仍然有一個問題,輸出始終是:「樹是空的,」 –

+0

接下來的問題是,您通過'node'指針傳遞給'insert'。這意味着對指針的任何更改都是該函數的本地操作,並且不會影響'main'中的指針。 –

回答

1

首先,插入稍微不正確。根指針必須通過引用傳遞。只是一些如:

void insert(node *& root, int item) 
{ 
    if(root == NULL) 
    { 
     node* temp = new node(); 
     temp->key = item; 
     temp->left = NULL; 
     temp->right = NULL; 
     root = temp; 
    } 
    else 
    { 
     if ((root->key) > item) 
     { 
      insert(root->left,item); 
     } 
     else 
     { 
      insert(root->right,item); 
     } 
    } 
} 

在結構上同文對你的代碼(除參照根)

另外,你的序遍歷是奇怪的,因爲它會打印出消息「樹空「。每次遍歷檢測到一個空節點。我想這樣修改:

void inorder(node* root) 
{ 
    if (root == NULL) 
    return; 

    inorder(root->left); 
    cout<<" "<<root->key<<" "; 
    inorder(root->right); 
} 

最後,我想稍微修改main()管理的情況下,當樹是空的(而不是做這裏面序遍歷):

int main() 
{ 
    node* root = NULL; 
    int flag = 1 , item; 
    while(flag == 1) 
    { 
     cout<<"Enter the number you want to enter : "; 
     cin>>item; 
     insert(root, item); 
     cout<<"Do you want to enter another number (1 -> YES)?"; 
     cin>>flag; 
    } 
    cout<<"The final tree is :"; 
    if (root == NULL) 
    cout << "The tree is empty."; 
    else 
    inorder(root); 
    cout << endl; 
    return 0; 
} 
+0

歡迎您! – lrleon