按顺序初始化树?



我使用初始化列表和帮助器按顺序创建树。例如{1,2,3,4,5,6,7}如果我按顺序遍历打印树,它也会给出1,2,3,4,5,6,7。

tree::tree(const initializer_list<int>& I) {
const int* p1 = I.begin();
root = nullptr;
IL_helper(I, p1, root);
}
void tree::IL_helper(const initializer_list<int>& I, const int*& p1, node* & p2) {
if (p1 == I.end()) {
return;
}

p2 = new node(*p1);
++p1;

IL_helper(I, p1, p2->Lchild);
IL_helper(I, p1, p2->Rchild);
}

如何用递归形成一个无序遍历的树。在我的代码中,我意识到它只有Lchild。树t{1,2,3,4,5,6,7};cout & lt; & lt;t.inOrderT (t.root);输出:1、2、3、4、5、6、7

p2 = new node(*p1);

覆盖p2,但它的类型只是node*,所以这个赋值不会影响函数之外的任何东西。只需将参数更改为node* &p2

另外,我看到了第二个问题-在您的示例中没有输入列表的分割-因此您将构建的树的节点将始终只有Lchild集。因为在IL_helper(I, p1, p2->Lchild);的递归链中,所有的列表都将被消耗,没有任何东西留给Rchild调用。从技术上讲,如果这是预期的行为(例如,树可能会在之后重新平衡),这不是一个bug,但这是吗?

最新更新