我知道也有类似的问题,但是遗憾的是没有一个问题真正符合我的问题……所以我应该创建一个优先级队列作为堆。我们已经提供了一些代码片段(而不是伪代码)来使用,但是如果我打印树,我将得不到正确的数字。
我目前正试图在队列中插入随机数并打印它们。队列元素是名为Queue_elem的自定义类。这是我的插入功能:
void Queue::insert(Queue_elem item){
this->container[number_elements] = item;
if (this->number_elements > 0) this->upHeap();
this->number_elements++;
}
number_elements是数组(容器)大小的计数器。这是我的upHeap:
void Queue::upHeap(){
for (int i = this->number_elements; i>=0; i = (i-1)/2) {
int parent = (i-1)/2;
if (this->container[i].getPriority() < this->container[parent].getPriority()) {
swap(this->container[i], this->container[parent]);
}
break;
}
}
就是这样。在我的主要文件中,我正在插入随机值,并尝试像这样打印它们:
Queue que(11);
mt19937 rng;
rng.seed(random_device()());
uniform_int_distribution<std::mt19937::result_type> dist6(1,50);
for (int i = 0; i < 10; ++i) {
Queue_elem tmp(dist6(rng));
que.insert(tmp);
}
cout << que.container[0].getPriority() << endl;
for (int i = 0; i < 5;i++) {
cout << que.container[(2*i)+1].getPriority() << endl;
cout << que.container[(2*i)+2].getPriority() << endl;
}
所以我要逐个检查树以正确的顺序打印数组,但这总是错误的...
如有必要,我也可以提供整个项目。预先感谢一堆。
编辑:Queue_elem
class Queue_elem {
public:
Queue_elem();
Queue_elem(int prio);
virtual ~Queue_elem();
int getPriority();
void setPriority(int prio);
int getId();
private:
int id;
int priority;
};
编辑2:输出是这样的:
1
18
29
26
37
30
44
46
48
49
0
答案 0 :(得分:0)
我没看到问题。您显示的输出与此堆相对应:
1
18 29
26 37 30 44
46 48 49
这是有效的最小堆。每个子节点都大于其父节点。请记住,在堆中,项目不一定要排序。
最后获得0的原因是因为您正在尝试打印没有右子节点的节点的右子。