2013-07-09 117 views
0

我正在構建二叉搜索樹。現在我遇到了向樹添加節點的問題。將節點添加到二叉搜索樹C++

void BinaryTree::add(int value, Node* node) { 
    if(!node) 
     node = new Node(value); 
    else if(node->key < value) 
     this->add(value, node->rightNode); 
    else if(node->key > value) 
     this->add(value, node->leftNode); 
} 

此代碼似乎並不當我打電話給工作:

BinaryTree test; 
test.add(4, test.root); 
test.add(1, test.root); 
test.add(5, test.root); 
test.add(2, test.root); 
test.add(3, test.root); 
test.add(7, test.root); 
test.add(6, test.root); 

第一添加通話後,樹「測試」的根源仍然是空的。 我應該如何更改代碼,以便在我調用add時節點會更新,並且節點會轉到樹的正確位置? 非常感謝!

+0

您可以通過引用傳遞'Node *'。 –

+0

是的,謝謝! @ShafikYaghmour – Ra1nWarden

回答

1

您是按值路過這裏的Node *

void BinaryTree::add(int value, Node* node) { 

一種解決方法是通過引用傳遞,而不是:

void BinaryTree::add(int value, Node *& node) { 
            ^

如果按值傳遞的功能正在接收的副本Node *所以對它的任何修改都不會反映回調用代碼。

另外,您可能想要考慮value等於key時會發生什麼情況。

+0

謝謝!我還有一個問題,當我通過值傳遞指針,複製的指針不指向同一個對象? – Ra1nWarden

+0

@ Ra1nWarden是的,它會指向同一個對象,因此如果修改對象,它將指向這些更改將被反映,但對指針本身的修改不會。 –

+0

我明白了。是的,我現在假設鑰匙是不同的。 – Ra1nWarden

0

遞歸調用add函數,但是在那裏我看不到實際將leftNode或rightNode分配給傳入的節點。

+0

如果節點參數已被正確聲明,則leftNode或rightNode將添加到下一個遞歸的基本情況中 – djf