c++ 按顺序初始化树?

uinbv5nw  于 2023-04-13  发布在  其他
关注(0)|答案(1)|浏览(149)

我使用初始化器列表和助手来创建一个有序的树。例如{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

zvokhttg

zvokhttg1#

p2 = new node(*p1);
重写p2,但其类型仅为node*,因此此赋值不会影响函数外部的任何内容。只需将参数更改为node* &p2
另外,我还发现了第二个问题--在您的示例中,输入列表没有二等分--因此您将构造的树的节点将始终只有Lchild集。因为在IL_helper(I, p1, p2->Lchild);的递归链中,所有列表都将被消耗,不会为Rchild调用留下任何内容。如果这是预期的行为,那么从技术上讲,这不是一个bug(例如,树可能会在之后重新平衡),但它是吗?

相关问题