我使用初始化器列表和助手来创建一个有序的树。例如{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. tree t{1,2,3,4,5,6,7} ;cout〈〈t.inOrderT(t.root);输出:1,2,3,4,5,6,7
1条答案
按热度按时间zvokhttg1#
p2 = new node(*p1);
重写
p2
,但其类型仅为node*
,因此此赋值不会影响函数外部的任何内容。只需将参数更改为node* &p2
。另外,我还发现了第二个问题--在您的示例中,输入列表没有二等分--因此您将构造的树的节点将始终只有
Lchild
集。因为在IL_helper(I, p1, p2->Lchild);
的递归链中,所有列表都将被消耗,不会为Rchild调用留下任何内容。如果这是预期的行为,那么从技术上讲,这不是一个bug(例如,树可能会在之后重新平衡),但它是吗?