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,
样例过了,后面几个没过是因为你数组开的太小了!