2015-11-06 77 views
0

我實現BST和我的實現看起來像這樣Bst-爲什麼我的Bst在將節點*鏈接到節點*之後工作?

void insert(node*&r,int key){  // 1) node* r 2) node*&r 
    if(r==NULL){ 
     r=new node(key); 
     return; 
    } 
    c++; 
    if(r->key > key){ 
     insert(r->right,key); 
    } 
    else if(r->key <key){ 
     insert(r->left,key); 
    } 
    } 

int main() 
{ 
    int n; 
    cin>>n; 
    node *root=NULL; 
    for(int i=0;i<n;i++){ 
     int x; 
     cin>>x; 
     insert(root,x); 
    } 
    return 0; 
} 

我之前不清楚爲什麼節點* &沒有節點*。但我有精神堵塞today.I很困惑,如果我們使用節點* &比我們將編輯根永遠是BST的身份,因此,我們將失去BST.On另一方面,我很困惑,爲什麼它不使用節點*。可有人請詳細介紹一下這方面的工作。哪一個,爲什麼?

回答

1

它現在可以工作,因爲您通過引用傳遞指針,因此它傳遞的函數可以修改它。否則,您通過值傳遞指針,並且在函數的出口處,作爲參數傳遞的指針不會被修改。

看看這裏發生了什麼:

node *root=NULL; // so initially root is nullptr 

然後,在for環,你有

insert(root,x); // better take it by reference, otherwise root is not modified 

在從插入出口,只有當按引用傳遞root被修改,否則,如果按值傳遞,則保持NULL。請記住,指針的行爲與任何其他變量相同,並且在C++中,它默認通過值傳遞。

+0

我有查詢假設最初根是(0x7FFFFFFF的(LET)),並且當我們BST插入值讓8.根將永久改變,因爲線的r =新節點(鍵)線,因爲我們通過引用傳遞根。所以當我們放鬆我們的根時,我們如何能夠插入從第二和第三插入的頂部開始..因爲它被修改。像我們使用臨時指針similary的情況下,鏈接列表插入保留根..我很抱歉,如果我犯傻了。 –

+0

@thoughtfulme否不,你修改'root-> right'(在'insert(r-> right,key);')行,同樣''root-> left',而不是'root'本身。如果最初是'NULL'(第一個'if'測試),那麼你只修改'root',這是正確的,因爲這是你第一次插入樹中。試着在思維上「運行」3-4個值的算法,你會看到發生了什麼。 – vsoftco

+0

如果我錯了,請糾正我的錯誤。因爲我們使用遞歸進行此操作。永久更改將發生在root-> left和root-> right,因爲它們現在是遞歸調用時的根。因此,我們的「實際root」將只有在第一種情況下才會改變,當我們的bst空了,並且只要我們對bst有一些價值,比如2.5 ..我們將在兩邊(取決於按鍵)往下移動,以及我們何時會找到地方正確插入。我們將永久地「改變」該節點的左邊的孩子或右邊的孩子....不是實際的根,因爲它是遞歸的。對於這樣一個長的評論:( –