2016-04-21 40 views
-2
void insert(int key) 
{ 
    insertRec(key, root); 
} 

void insertRec(int key, Node *current) 
{ 
    if(current==NULL) 
     current = new Node(key); 
    else if(key <= current->value) 
     insertRec(key, current->leftChild); 
    else 
     insertRec(key, current->rightChild); 
} 

這是怎麼回事?二叉樹遞歸插入法不起作用

在插入函數中,樹的鍵值和根被傳遞給insertRec。如果節點爲空,則創建一個新節點並將其設置爲鍵值。否則,遞歸地向左或向右移動,直到節點遇到空點並在那裏插入新節點。

+1

[找到一個很好的入門書(http://stackoverflow.com/questions/ 388242/the-definitive-c-book-guide-and-list)並閱讀關於傳遞參數*的引用*。 –

+3

分配一個局部變量'current'與插入節點不一樣。它只是修改局部變量,而不是*變量所指的*,這就是你想要的。爲了將來的參考,儘量避免只是說「東西不行」。描述*你的代碼如何工作。 – Zong

+0

'void insertRec(int key,Node *&current)'應該做的伎倆。 –

回答

2

這不是真的代碼'不起作用'。當然,正如它所寫的那樣,它是有效的。問題是你寫了一些與你所需要的不同的東西。

當您將參數傳遞給insertRec()時,例程會獲得指向Node對象的指針的副本。所以,當你在

current = new Node(key); 

分配一個值,你在局部變量current重寫本地副本。調用函數(及其數據)不知道它。

如果你想在主叫方收到新的值,聲明一個函數需要a reference變量:

void insertRec(int key, Node *&current) 
+0

謝謝。按照我的意願添加&製作代碼。但是我對*和&感到困惑。我以爲他們都指向相同的地址,在這種情況下,它是根節點的地址,我可以通過指針電流修改值。 – Raymond

+0

這是沒有辦法的奇怪,只是一個指針的引用。這種引用只是一個掩碼下的指針。你可以通過聲明'void insertRec(int key,Node ** current)'並使用'insertRec(key,&(current-> leftChild))'來指明指針的顯式指針;'(不需要內部圓括號,只是爲了便於閱讀)。然後主分配應該看起來像'* current = new Node(key);'帶有明確的解引用。 – CiaPan