2016-12-10 3 views
1

私は、テンプレートとSTLを一般的に使用するのではなく、かなり新しいです。それでも私の研究はしていますが、私は勉強に苦しんでいます。私はTreeNode implementationを見つけましたが、私は試してみたいのですが、オブジェクトを初期化するのに問題があります。コンストラクタでそれ自身を実装するクラステンプレートを初期化する

コンストラクタでは、パラメータの1つが自身への参照です。しかし、作成されたことがない場合、親ノードへの参照をどのように渡しますか?

TreeNode(TreeNode<T>* parent, T data); 

いずれの方向も良いでしょう。私はこの構造についてもっと学びたいと思っています。

ありがとう

+2

最初のパラメータは、ポインタのようです親ノードに送信する。私は木の根に 'nullptr'を与えなければならないと思います。 – nickie

+1

@nickie私はそれに旋風を与え、それは働いた。私はちょうど私の恥の散歩をしましょう... – user0000001

+1

Hehe、乾杯... :-) – nickie

答えて

1

最初のパラメータは親ノードへのポインタであるようです。 (パラメータの名前はparentですが、またなぜならそれはlinked implementationに使われている方法のためだけでなく、例えば、thisにこのパラメータを設定する方法addChildを参照してください。)

したがって、ツリーのルートを構築することはnullptrにする必要があります親の場所。

tree

ところで、リンクされた実装は方法getChildaddChildを提供する:ツリーを生成

TreeNode<int>* leftChild = new TreeNode<int>(root, 17); 
TreeNode<int>* rightChild = new TreeNode<int>(root, 37); 
TreeNode<int>* rightGrandChild = new TreeNode<int>(rightChild, 64); 

TreeNode<int>* root = new TreeNode<int>(nullptr, 42); 

その後は、他のノードは、既存のノードの子として追加することができます既存のノードに子ノードを追加/追加するために使用します。これら二つを使用して、以下のように、上記ツリーを構築することができます。

TreeNode<int>* root = new TreeNode<int>(nullptr, 42); 
root->addChild(17); 
root->addChild(37); 
root->getChild(1)->addChild(64); // add to root's child[1] 

私見、それはへのポインタを取る基本となる実装(すなわち、クラスのコンストラクタを公開することなく、ルートのツリーを構築する方法を欠けているように見えます親ノード)。私コンストラクタはプライベート作ると静的メソッドの追加をお勧めしたい:

これを使用して
template <class T> 
static TreeNode<T>* TreeNode<T>::makeRoot (const T& data) { 
    return new TreeNode<T>(nullptr, data); 
} 

を、上記のツリーはADTとしてのTreeNodeを使用して構築することができます

TreeNode<int>* root = TreeNode<int>::makeRoot(42); 
root->addChild(17); 
root->addChild(37); 
root->getChild(1)->addChild(64); // add to root's child[1] 
関連する問題