我最近问了一个关于正确的方法的问题,以便在C ++ 11中创建一个类。我通过建立一个Tree
课程来练习,我收到了一些很好的建议。但是,我很难理解为什么我的代码无效。
特别是,我无法理解为什么我的insert
方法无法正常工作。
template<typename T>
class Tree {
private:
struct Node {
T data;
Node* p_left;
Node* p_right;
};
Node* newNode(T data) { return new Node {data, nullptr, nullptr}; }
Node* root_;
//Other functions, etc... (copy constructor and copy assignment operator)
public:
void insert(T const data) {
Node*& root = root_;
while (root != nullptr) {
root = (data <= root->data ? root->p_left : root->p_right);
}
root = newNode(data);
}
Tree(): root_(nullptr) {}
//Other constructors, functions, etc...
};
如果我创建一个新的Tree
对象,然后使用某些数据填充该对象,则该对象仅保留最后一条插入的数据。因为我的指针参考,我知道我在某处乱搞,但我无法弄清楚在哪里。任何正确方向的提示都会非常感激。
答案 0 :(得分:0)
两个问题......首先,在第一次插入树时,您没有更新root
:
if (root == nullptr) { return newNode(data); }
实际上,即使insert
函数返回void
,您也将返回新节点。如果你完全删除该行,代码应该工作。如果root
以nullptr
开头,则会跳过while循环,root
将更新为新节点。
第二个问题是您正在使用对节点指针的引用,这意味着每次创建新节点时都会移动树的root_
。这不一定是个好主意。就个人而言,我会这样写:
void insert(T const data) {
Node** proot = &root_;
while (*proot != nullptr) {
proot = (data <= (*proot)->data ? (*proot)->p_left : (*proot)->p_right);
}
*proot = newNode(data);
}