2016-09-09 15 views
0

私は、バイナリ検索ツリーに挿入する機能を構築しようとしているが、私はそれが動作しない理由を考え出す苦労しています。関数がどのように動作するのか基本的に理解していますが、与えられたテンプレートに基づいて、BSTクラスの作成を避け、代わりにNodeクラスに依存し、それを処理する目的の関数を構築するようです。ここで指定したテンプレートです:C++のバイナリ検索ツリーを挿入実装

#include <iostream> 
#include <cstddef> 

using std::cout; 
using std::endl; 

class Node { 
    int value; 
public: 
    Node* left;  // left child 
    Node* right;  // right child 
    Node* p;   // parent 
    Node(int data) { 
     value = data; 
     left = NULL; 
     right = NULL; 
     p = NULL; 
    } 
    ~Node() { 
    } 
    int d() { 
     return value; 
    } 
    void print() { 
     std::cout << value << std::endl; 
    } 
}; 

function insert(Node *insert_node, Node *tree_root){ 
    //Your code here 
} 

私がいる問題は、私がのgetValueがノードのための単純なgetterメソッドで次のコードを実装するときです:

int main(int argc, const char * argv[]) { 
    Node* root = NULL; 
    Node* a = new Node(2); 
    insert(a, root); 
} 

void insert(Node *insert_node, Node *tree_root){ 
    if (tree_root == NULL)  
     tree_root = new Node(insert_node->getValue()); 

コードをコンパイルして実行するように見えますこの後にrootでもう一度チェックを実行すると、NULLが返されます。私がここで何を欠いているのか? rootをinsert_nodeのノードと等しい新しいノードに置き換えないのはなぜですか?

また、私は、これはBSTを実装するための最適な方法ではありませんが、私は私に与えられたテンプレートで動作するようにしようとしています実現。アドバイスをいただければ幸いです。

+1

*引数をC++で参照渡しで検索する方法については、こちらを参照してください。 –

+0

'void insert(ノード* insert_node、Node *&tree_root)'です。 – Jarod42

+0

さらに良い 'のボイド挿入(STD :: unique_ptrを insert_node、STD :: unique_ptrを&tree_root)'。 – Jarod42

答えて

0

ヨアヒムはあなたの問題を参照することによって、その値によってパラメータを渡すの間の差異に関連言ったように。あなたのコードで

void insert(Node *insert_node, Node *tree_root)あなたは値によってNode* tree_rootを渡します。関数内では、このポインタのローカルコピーを変更するので、外側の値は変更されません。あなたはreferenceNode* tree_rootを渡す必要があり、それを修正するには

。パラメータの宣言はNode*& tree_root(またはNode** tree_root)です。例:

void insert(Node* insert_node, Node*& tree_root){ 
    if (tree_root == NULL)  
     tree_root = new Node(insert_node->getValue()); 
+0

ありがとう、これはこれの優れた説明だった。私はまだ参照のための引数を渡すために最も適切な時代に私の頭を完全に包み込み、確かにもっと読んでいますが、この説明は大いに役立ちました。 – Brendan

関連する問題