一早起来复盘了昨天做的堆,还算不错的,昨天GIS大赛公布结果了,虽然没有拿奖,也难免小小的失落,但是荣辱不惊就是最棒的~!
接下来上代码和注释。
这题就是考堆的基本知识吧,感觉放在12题也还好的哄。
原题:
小顶堆:每个结点的值都小于或等于其左右孩子结点的值
(下面的图是我复制别人的)
堆是完全二叉树
左移运算符
上代码,注释极其详细易懂
#include<iostream>
using namespace std;
#define maxn 10010
int heap[10010];
int n;//插入元素个数
//建堆
void push(int x)
{
int tmp,flag=0;
while(x!=1&&!flag)//x不能等于1,
{
if(heap[x>>1]>heap[x])//要建小顶堆,根结点的值不能比左右结点大
{
tmp=heap[x];
heap[x]=heap[x>>1];
heap[x>>1]=tmp;
}
else
flag=1;//老顺利了,因为之前的都是这么比过来的,所以要是这一关根结点没有比它大了就不用比了
x>>=1; //如果成功换了位子,那么就要代替被替代的那个家伙的位置继续比下去
///这是堆的精髓
}
}
int father(int x)
{
int i;
for(i=1;i<=n;i++)
{
if(heap[i]==x)
break;
}
return heap[i>>1];
}
int main()
{
int m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>heap[i];
//新的结点进来了就要进行排序
push(i);
}
int x,y;
char s[10];
while(m--)
{
scanf("%d%s",&x,s);
if(s[0]=='a')
{
scanf("%d%s",&y,s);
scanf("%s",s);
printf(father(x)==father(y)?"T\n":"F\n");
}
else
{
scanf("%s",s);
if(s[0]=='a')
{
scanf("%s",s);
scanf("%s%d",s,&y);
printf(father(x)==y?"T\n":"F\n");
}
else
{
scanf("%s",s);
if(s[0]=='r')
{
printf(heap[1]==x?"T\n":"F\n");
}
else
{
scanf("%s%d",s,&y);
printf(x==father(y)?"T\n":"F\n");
}
}
}
}
return 0;
}
以上就是全部。
总结几点:
- 堆的精髓是孩子索引除以2就等于父亲
- 建堆的时候,如果两个结点的位置交换了,那么被交换的结点还应于新的父亲作比较,如果第一次就顺利了就不用比较了。
- 索引为1的不可以再判断,因为1已经找不到父结点跟它做比较了,左移一位会错乱。
- scanf输入字符串,不接受空格
over。
这次放的图是我在南京东路拍的,很有霓虹的感觉,这周六要去欢乐谷过万圣节了,这两天要好好努力~yy加油 ~
本文转载自:
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42576687/article/details/88904232