很抱歉,如果这是重复的。我保证我会先找到答案。
我想使用向量创建二进制堆。为此,我必须实现一个弹出功能,以删除“顶部”。在这种情况下,它只是删除了第一个元素。
我尝试使用移动功能,例如:
items[Root()] = std::move(items[cur_size--]);
这应该将根与另一个元素交换,然后将其重新排序(这也一直没有起作用)。
相反,我尝试了以下方法:
std::vector<int> items;
int root = 0;
size_t Root() {
return root;
}
void Pop() {
items.erase(items.begin()+root);
root++;
// here I would call the reorder function
}
通过这种方式,我将有效地更改根并像矢量从第n个位置(而不是从0开始)开始操作。
我的问题是,这有意义吗,还是有一种更好的方法可以实现呢?
编辑:添加的向量
答案 0 :(得分:0)
要弹出std::vector
的第一个元素(简称为myvector
),只需编写:
myvector.erase(myvector.begin()); // pop front
现在,如果您将二叉树存储在std::vector
中,则删除根将使您剩下两个孩子(两个根)。
如果您只想保留两个子树之一,则需要选择一个(新的根)。
然后,根据您的std::vector
是否将二叉树存储在其中 宽度优先 或 深度优先 ,您必须搜索与子树相关的所有元素您想要保留(Breadth-first search或Depth-first search)并使用所需的子树构建另一个std::vector
。最后,您将计算出的子树影响到原始树向量。
我希望这会对您有所帮助。