2015-11-19 57 views
0

我是在二叉樹程序的差異,這個節目曾是什麼在這兩個程序

#include <iostream> 

using namespace std; 

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



void insert(node **rootnode , int value) { 

    node* newnode = *rootnode; 

    if (newnode == NULL) { 
     newnode = new node; 
     newnode->left = NULL; 
     newnode->right = NULL; 
     newnode->data = value; 
     *rootnode = newnode; // this was missing! 
    } 
    else if (value < newnode->data){ 
     insert(&newnode->left , value); 
    } 
    else if (value > newnode->data ){ 
     insert (&newnode->right , value); 
    } 


} 

void inorder (node *root){ 
    if (root == NULL){ 
     return; 
    } 
    else{ 
     inorder(root->left); 
     cout << root->data << endl; 
     inorder(root->right); 
    } 
} 




int main(){ 

    node* root = NULL; 

    insert (&root , 4); 
    insert (&root , 5); 
    insert (&root , 2); 
    insert(&root , 10); 
    insert(&root , 1); 

    //cout << root->data << endl; 
    inorder(root); 

} 

現在我試圖讓這個不經過根節點的參考...但它不工作。 ..我沒能找到爲什麼..

#include <iostream> 
using namespace std; 

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



void insert(node *rootnode , int value) { 

    node* newnode = rootnode; 

    if (newnode == NULL) { 
     newnode = new node; 
     newnode->left = NULL; 
     newnode->right = NULL; 
     newnode->data = value; 
     rootnode = newnode; // this was missing! 
    } 
    else if (value < newnode->data){ 
     insert(newnode->left , value); 
    } 
    else if (value > newnode->data ){ 
     insert (newnode->right , value); 
    } 


} 

void inorder (node *root){ 
    if (root == NULL){ 
     return; 
    } 
    else{ 
     inorder(root->left); 
     cout << root->data << endl; 
     inorder(root->right); 
    } 
} 




int main(){ 

    node* root = NULL; 

    insert (root , 4); 
    insert (root , 5); 
    insert (root , 2); 
    insert(root , 10); 
    insert(root , 1); 

    //cout << root->data << endl; 
    inorder(root); 

} 

第二種方案只是給了空輸出...我認爲根節點沒有更新..但我don'nt知道爲什麼....

+2

這聽起來像你可能需要學習如何使用一個調試器來遍歷你的代碼。使用一個好的調試器,您可以逐行執行您的程序,並查看它與您期望的偏離的位置。如果你打算做任何編程,這是一個重要的工具。深入閱讀:** [如何調試小程序](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver

回答

3

Functio n個參數是函數的局部變量。他們得到相應參數值的副本。

你能想象下面的函數聲明

void insert(node *rootnode , int value); 

,並呼籲

insert (root , 4); 

通過以下方式

void insert(/*node *rootnode , int value*/) 
{ 
    node *rootnode = root; 
    int value = 4; 
    //... 

退出這些局部變量將被銷燬的功能後。 varibale root的原始值將不會更改,因爲該函數會處理root的副本。

所以如果你想改變任何傳遞給函數中的函數的對象,你需要通過C語言中的引用或C++的意思來傳遞它。

這是在C你傳遞一個指針的對象。在C++中,您可以使用相同的方法或聲明相關參數作爲參考。

那麼在C函數聲明可以像

void insert(node **rootnode , int value) ; 

而在C++中它可以看看要麼喜歡上面或下面的方式

void insert(node * &rootnode , int value) ; 
+0

非常感謝..你的解釋只是真棒... – Rohit

+0

@Rohit不客氣。:) –