【发布时间】:2021-12-30 20:09:20
【问题描述】:
我正在尝试为在线法官实现堆结构。我对实现非常满意,它支持我所有的测试用例,但在线法官拒绝了它。
插入函数追加新元素,然后将其冒泡到二叉树中。 removeMax 函数将向量中最大的元素替换为最后一个元素,然后将其冒泡。
vector<int> heap;
int getMax(){
return heap[0];
}
int getSize(){
return heap.size();
}
void insert(int element){
heap.push_back(element);
int i = heap.size() - 1;
while(element > heap[i / 2]) {
swap(heap[i], heap[i / 2]);
i = i / 2;
}
}
void removeMax(){
heap[0] = heap[heap.size() - 1];
heap.pop_back();
int i = 0;
int iGreater = heap[i * 2] > heap[i * 2 + 1] ? i * 2 : i * 2 + 1;
while(i < heap.size() && heap[i] < heap[iGreater]) {
swap(heap[i], heap[iGreater]);
i = iGreater;
iGreater = heap[i * 2] > heap[i * 2 + 1] ? i * 2 : i * 2 + 1;
}
}
【问题讨论】:
-
在你的
insert函数中,如果新元素的索引在i和i/2之间会发生什么? -
如果
heap包含两个或更少的元素,removeMax会导致未定义的行为。 -
要使
i/2技巧起作用,您可能需要从索引 1 开始堆。 -
你确定
heap是一个全局变量吗?哪个是在线评委?你能引用代码挑战吗? -
问题来自 Kattis,ID 为 heap。
标签: c++ binary-tree heap