9.26

第一,

1,什么是堆? 总之,是一种特殊的数据结构,可以看作一种树形结构。

对于他的右儿子,乘2加1,人家用了按位或“|”,意思是同为1,则为0,否则都是1.我测试了一下,还真能

同时左移1位肯定就算是2倍了。

对了了爸爸,左儿子,右儿子是个啥东西。

2,堆。。。

3,定义一个结构体,heap;

里面先开一个很大的数组。(int)

然后定义一个底部的变量,tot;

4,然后看支持的操作

top

push,但是插入你得满足人家heap本来的性质哇,所以引入了modify操作,可以理解为辅助push操作的一个东西,内部就是一个递归函数,和它的父亲比较,大就上去,确实有点类似与冒泡。

对了这个是从底部插入的。

对了modify中加了一句,if(x==1),return;  我不懂。。

pop,和上面的push同理,你弹出是弹出,但是heap为了满足自己的性质,必须做出修正,所以引出了repair,但是pop比push复杂一些。

首先你得明白,pop是怎么操作的,我靠,这pop怎么把人家heap顶的值给弹走了。。所以你pop是把顶端值给弹没了?

好吧,人家要弹heap顶的值,你得先把heap顶和heap最底端给交换,然后把底端给弹了w[--tot]...然后顶端就是一般是个很小的值,所以要传下去,然后就用到了repair函数,先定义一个tar看左右儿子哪个大,然后顶端和tar比较。。一般是小的,然后传下去,然后递归继续。。

我觉得这三个是最基本的操作。。返回顶端值,插入操作,弹出操作。

5,

然后后面是个 heap h;

这个语句才是用的。。?

然后才int main

也就是说你这个结构体是在 using namespace std和in main()之间的。

6,怎么基本抄都不过去。

7,

样例过了,后面几个没过是因为你数组开的太小了!

原文地址:https://www.cnblogs.com/beiyueya/p/11594856.html