我对使用模板和STL很新。仍然在做我的研究,但遇到了一个我很难理解的课程。我发现了TreeNode implementation我想修补但我在初始化对象时遇到了问题。
在构造函数中,其中一个参数是对自身的引用。但是,如果它从未被创建过,那么你如何将引用传递给父节点?
TreeNode(TreeNode<T>* parent, T data);
任何方向都会很好。我想更多地了解这个结构。
由于
答案 0 :(得分:1)
似乎第一个参数是指向父节点的指针。 (不仅因为参数的名称是parent
,还因为它在linked implementation中的使用方式,例如,请参阅方法addChild
,将此参数设置为this
。)
因此,构建树的根应该在父母的位置有一个nullptr
。
TreeNode<int>* root = new TreeNode<int>(nullptr, 42);
随后,可以添加其他节点作为现有节点的子节点:
TreeNode<int>* leftChild = new TreeNode<int>(root, 17);
TreeNode<int>* rightChild = new TreeNode<int>(root, 37);
TreeNode<int>* rightGrandChild = new TreeNode<int>(rightChild, 64);
生成树:
顺便说一下,链接实现提供了方法getChild
和addChild
,用于获取/添加现有节点的子节点。使用这两个,上面的树可以构造如下:
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);
}
使用它,可以使用TreeNode作为ADT构建上述树:
TreeNode<int>* root = TreeNode<int>::makeRoot(42);
root->addChild(17);
root->addChild(37);
root->getChild(1)->addChild(64); // add to root's child[1]