0

私は二分探索木を構築しています。現在、ツリーにノードを追加する際に問題が発生しています。

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 呼び出しの後、ツリー 'test' のルートはまだ空です。add を呼び出してノードがツリーの正しい場所に移動したときに更新されるように、コードを変更するにはどうすればよいですか? どうもありがとうございました!

4

2 に答える 2

1

Node *ここで値を渡しています:

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

1 つの解決策は、代わりに参照渡しすることです。

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

値渡しの場合、関数は のコピーを受け取るだけなNode *ので、それを変更しても呼び出し元のコードには反映されません。

valueまた、が に等しい場合に何が起こるかを考えたいと思うかもしれませんkey

于 2013-07-09T18:28:10.180 に答える
0

add 関数を再帰的に呼び出しますが、渡されたノードに leftNode または rightNode を実際に割り当てているところはどこにもありません。

于 2013-07-09T18:27:51.797 に答える