codevs 2879 堆的判断

  题目描述 Description

  堆是一种常用的数据结构。二叉堆是一个特殊的二叉树,他的父亲节点比两个儿子节点要大,且他的左右子树也是二叉堆。现在输入一颗树(用二叉树的数组表示,即a[i]的左儿子与右儿子分别为a[2i],a[2i+1]),要求判断他是否是一个堆。

  输入描述 Input Description

  一个整数N,表示结点数。

  第二行N个整数,表示每个结点代表的数字

  输出描述 Output Description

  如果是,输出‘Yes’

  否则输出‘No’

  样例输入 Sample Input

  5

  1 2 3 4 5

  样例输出 Sample Output

  No

  数据范围及提示 Data Size & Hint

  1<N<100

  数字在2^31以内

  很洪水的一道题,发出来就是为了证明我还活着。。 

 

  恶补一下基础知识 。堆(也叫优先队列),是一棵完全二叉树,它的特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆)。它常用于管理算法执行过程中的信息,应用场景包括堆排 序,优先队列等。

  

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

bool flag;
int n,i,j,a[103111];
int main()
{
    cin>>n;
    for(i=1;i<=n;++i)
        cin>>a[i];
    for(i=1;i<=n;++i)
    {
        if(a[i]>a[i<<1]&&a[i]>a[i<<1+1])
        continue;
        else 
        {
            flag=true;
            break;
        }
    }
    if(flag) cout<<"No";
    else cout<<"Yes";
}

 

 

posted @ 2016-12-31 09:17  杀猪状元  阅读(166)  评论(0编辑  收藏  举报