PAT Grade 1147 Heaps (30 minutes) (sequence traversal, how achievements, the order output, there is an easier way ~)

1147 Heaps (30 minutes)
 

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

 

Meaning of the questions:

To a tree traversal sequence, determine if it is the heap, the heap is large or small roof top stack. The output postorder traversal of tree ~

answer:

When the input program to borrow queue traversal achievements, while the determination of the type of reactor, since the built recursively preorder tree output.

Violence too cumbersome method, the code below someone's home. . .

While thinking of this question is easy to do, but less skilled achievements, achievements are usually two ways:: an array of achievements and contribution list, see the two methods of achievements

AC Code:

 

#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
using namespace std;
int m,n;
struct node{
    int v;
    node *l,*r;
};
queue<node*>q;
int sum=0;
node* newnode(int x){//新建一个节点 
    node* newnode = new node;
    newnode->v=x;
    newnode->l=newnode->r=NULL;
    returnnewNode; 
} 
void postorder (the root Node * &) { // postorder 
    IF (directory root-> L) postorder (directory root-> L);
     IF (directory root-> R & lt) postorder (directory root-> R & lt); 
    SUM ++; // for calculating whether or not to add a space 
    COUT << directory root-> V;
     iF (= SUM n-!) COUT << "  " ;
     the else COUT << endl; 
} 
int main () { 
    CIN >> m >> n-;
     int X; 
    Node * the root;
     for ( int I = . 1 ; I <= m; I ++) {
         Int F = 0 ; // ascending greatly. 1 
        the while (! Q.empty ()) q.pop ();
         for ( int J = . 1 ; J <= n-; J ++ ) { 
            CIN >> X;
             IF (J == . 1 ) { 
                the root = newNode (X); 
                q.push (the root); 
                Continue ; 
            } 
            the while (! q.empty ()) { // sequence queue traversal is more convenient with 
                Node A * = q.front (); 
                Node * B = newNode (X);
                IF (A-> L == NULL) { 
                    A -> L = B; 
                } the else  IF (A-> R & lt == NULL) { 
                    A -> = R & lt B; 
                } the else { 
                    q.pop (); // if about node team head filled and then put it away out of the queue head 
                    Continue ; 
                } 
                q.push (B); 
                IF (F == 0 && A-> V <X) { // interpretation tree type 
                    F = . 1 ; // ascending greatly. 1 
                } the else  IF (F == 0A- &&> V> X) { 
                    F = 2 ; // descending to 2 
                } the else  IF (F == . 1 && A-> V> X) { 
                    F = - . 1 ; // do not meet the conditions - . 1 
                } the else  IF (F == 2 && A-> V < X) { 
                    F = - . 1 ; 
                } 
                BREAK ; // remember to jump 
            } 
        } 
        SUM = 0 ;
         IF(f==1){
            cout<<"Min Heap"<<endl;        
        }else if(f==2){
            cout<<"Max Heap"<<endl;
        }else cout<<"Not Heap"<<endl;
        postorder(root);
    }
    return 0;
} 

 

Easier way without achievements:

Liu God's promise big practice

First, according to v [0] and v [1] determines the magnitude comparison may be large or small roof top, were assigned flag is 1 and -1, in accordance with the first traversal sequence, from 0 to n / 2-1 all have children [ node] judge their child is not to meet the requirements of the flag, if a node is not met, it will flag = 0 indicates that this is not a heap. The flag whether the output stack, the large top stack or small top stack and postorder traversal The index traversal index * 2 + 1 and the index * 2 + 2, respectively, i.e. their left and right children, traversed output after root left and right subtrees after the junction, i.e. complete preorder ~

#include <iostream>
#include <vector>
using namespace std;
int m, n;
vector<int> v;
void postOrder(int index) {
    if (index >= n) return;
    postOrder(index * 2 + 1);
    postOrder(index * 2 + 2);
    printf("%d%s", v[index], index == 0 ? "\n" : " ");
}
int main() {
    scanf("%d%d", &m, &n);
    v.resize(n);
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) scanf("%d", &v[j]);
        int flag = v[0] > v[1] ? 1 : -1;
        for (int j = 0; j < n / 2; j++) {
            int left = j * 2 + 1, right = j * 2 + 2;
            if (flag == 1 && (v[j] < v[left] || (right < n && v[j] < v[right]))) flag = 0;
            if (flag == -1 && (v[j] > v[left] || (right < n && v[j] > v[right]))) flag = 0;
        }
        if (flag == 0) printf("Not Heap\n");
        else printf("%s Heap\n", flag == 1 ? "Max" : "Min");
        postOrder(0);
    }
    return 0;
}

 

 

 

 

Guess you like

Origin www.cnblogs.com/caiyishuai/p/11899079.html