PAT Advanced 1147 Heaps (30分)

In computer science, a heap is a specialized tree-based data structure that satisfies the heap property: if P is a parent node of C, then the key (the value) of P is either greater than or equal to (in a max heap) or less than or equal to (in a min heap) the key of C. A common implementation of a heap is the binary heap, in which the tree is a complete binary tree. (Quoted from Wikipedia at https://en.wikipedia.org/wiki/Heap_(data_structure))

Your job is to tell if a given complete binary tree is a heap.

Input Specification:

Each input file contains one test case. For each case, the first line gives two positive integers: M (≤ 100), the number of trees to be tested; and N (1 < N ≤ 1,000), the number of keys in each tree, respectively. Then M lines follow, each contains N distinct integer keys (all in the range of int), which gives the level order traversal sequence of a complete binary tree.

Output Specification:

For each given tree, print in a line Max Heap if it is a max heap, or Min Heap for a min heap, or Not Heap if it is not a heap at all. Then in the next line print the tree‘s postorder traversal sequence. All the numbers are separated by a space, and there must no extra space at the beginning or the end of the line.

Sample Input:

3 8
98 72 86 60 65 12 23 50
8 38 25 58 52 82 70 60
10 28 15 12 34 9 8 56

Sample Output:

Max Heap
50 60 65 72 12 23 86 98
Min Heap
60 58 52 38 82 70 25 8
Not Heap
56 12 34 28 9 8 15 10

题目大意:这题是一道堆题,给定一个数组,判定是否为堆。

我的想法,从(N/2)开始往前循环,第N/2是倒数第一个父亲。往前,判定左子树是否符合,如果存在右子树,判定右子树是否符合。

最后修正打印。

注意:判定最后一个父亲是N/2不是vector.size()/2。这边有一个测试点

后面那个很简单,一个后序遍历进行打印即可

#include <iostream>
#include <vector>
using namespace std;
vector<int> v;
void postTraserve(vector<int>& res,int index){
    if(index*2<v.size())postTraserve(res,index*2);
    if(index*2+1<v.size())postTraserve(res,index*2+1);
    res.push_back(v[index]);
}
int main(){
    int M,N;
    int heapType;/** 1 maxHeap -1 minHeap 0 notHeap */
    cin>>M>>N;
    v.resize(N+1);
    while(M--){
        /** input */
        for(int i=1;i<=N;i++)
            cin>>v[i];
        /** judge */
        v[1]>v[2] ? heapType=1:heapType=-1;
        for(int i=N/2;i>0;i--){
            if(v[i]<v[i*2]&&heapType==1) heapType=0;
            if(v[i]>v[i*2]&&heapType==-1) heapType=0;
            /**如果右孩子存在,判定右孩子 */
            if(i*2+1<=N){
                if(v[i]<v[i*2+1]&&heapType==1) heapType=0;
                if(v[i]>v[i*2+1]&&heapType==-1) heapType=0;
            }
        }
        if(heapType==1) cout<<"Max Heap"<<endl;
        else if(heapType==0) cout<<"Not Heap"<<endl;
        else cout<<"Min Heap"<<endl;
        vector<int> res;
        postTraserve(res,1);
        for(int i=0;i<res.size();i++)
            if(i!=res.size()-1) cout<<res[i]<<" ";
            else cout<<res[i];
        cout<<endl;
    }
    system("pause");
    return 0;
}

原文地址:https://www.cnblogs.com/littlepage/p/12207298.html

时间: 2024-08-02 02:37:36

PAT Advanced 1147 Heaps (30分)的相关文章

PAT 甲级1057 Stack (30 分)(不会,树状数组+二分)*****

1057 Stack (30 分) Stack is one of the most fundamental data structures, which is based on the principle of Last In First Out (LIFO). The basic operations include Push (inserting an element onto the top position) and Pop (deleting the top element). No

PAT甲级——1147 Heaps【30】

In computer science, a heap is a specialized tree-based data structure that satisfies the heap property: if P is a parent node of C, then the key (the value) of P is either greater than or equal to (in a max heap) or less than or equal to (in a min h

PAT Advanced 1035 Password (20分)

To prepare for PAT, the judge sometimes has to generate random passwords for the users. The problem is that there are always some confusing passwords since it is hard to distinguish 1 (one) from l (L in lowercase), or 0 (zero) from O (o in uppercase)

1147. Heaps (30)

In computer science, a heap is a specialized tree-based data structure that satisfies the heap property: if P is a parent node of C, then the key (the value) of P is either greater than or equal to (in a max heap) or less than or equal to (in a min h

PAT Advanced 1029 Median (25分)

Given an increasing sequence S of N integers, the median is the number at the middle position. For example, the median of S1 = { 11, 12, 13, 14 } is 12, and the median of S2 = { 9, 10, 15, 16, 17 } is 15. The median of two sequences is defined to be

PAT Advanced Level 1064 Complete Binary Search Tree (30)(30 分)

1064 Complete Binary Search Tree (30)(30 分) A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains only nodes with keys less than the node's key. The right subtree of

PAT Advanced 1055 The World&#39;s Richest (25分)

Forbes magazine publishes every year its list of billionaires based on the annual ranking of the world's wealthiest people. Now you are supposed to simulate this job, but concentrate only on the people in a certain range of ages. That is, given the n

PAT Advanced 1093 Count PAT&#39;s (25分)

The string APPAPT contains two PAT's as substrings. The first one is formed by the 2nd, the 4th, and the 6th characters, and the second one is formed by the 3rd, the 4th, and the 6th characters. Now given any string, you are supposed to tell the numb

PAT甲级——1131 Subway Map (30 分)

可以转到我的CSDN查看同样的文章https://blog.csdn.net/weixin_44385565/article/details/89003683 1131 Subway Map (30 分) In the big cities, the subway systems always look so complex to the visitors. To give you some sense, the following figure shows the map of Beijing