1147. Heaps

Direct Link

#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;

class TreeNode {
public:
    TreeNode(int v):data(v), left(NULL), right(NULL) { }

    int data;
    TreeNode *left, *right;
};

class BinaryTree {
public:
    BinaryTree(int n) {
        this->nodeNum = n;
    }

    void build(const vector<int> &levelOrd) {
        root = this->internalBuild(levelOrd, 1);
    }

    bool isMaxHeap() {
        return this->internalIsMaxHeap(this->root);
    }

    bool isMinHeap() {
        return this->internalIsMinHeap(this->root);
    }

    vector<int> getPostOrder() {
        vector<int> postOrd;
        this->internalPostOrder(this->root, postOrd);
        return postOrd;
    }

private:
    // heap must be complete binary tree
    // for node index i, left node index is 2*i, right node index is 2*i+1 
    TreeNode * internalBuild(const vector<int> &levelOrd, int pos) {
        TreeNode *node = new TreeNode(levelOrd[pos]);
        if ((pos << 1) < levelOrd.size())
            node->left = internalBuild(levelOrd, pos << 1);
        if ((pos << 1) + 1 < levelOrd.size())
            node->right = internalBuild(levelOrd, (pos << 1) + 1);
        return node;
    }

    // recursive check max heap definition
    bool internalIsMaxHeap(const TreeNode *node) {
        return (!node->left || node->data >= node->left->data)
            && (!node->right || node->data >= node->right->data)
            && (!node->left || this->internalIsMaxHeap(node->left)) 
            && (!node->right || this->internalIsMaxHeap(node->right));
    }

    // recursive check max heap definition, similar with max heap
    bool internalIsMinHeap(const TreeNode *node) {
        return (!node->left || node->data <= node->left->data)
            && (!node->right || node->data <= node->right->data)
            && (!node->left || this->internalIsMinHeap(node->left)) 
            && (!node->right || this->internalIsMinHeap(node->right));
    }

    void internalPostOrder(TreeNode *node, vector<int> &postOrd) {
        if (!node) return;
        if (node->left) this->internalPostOrder(node->left, postOrd);
        if (node->right) this->internalPostOrder(node->right, postOrd);
        postOrd.push_back(node->data);
    }

    int nodeNum;
    TreeNode *root;
};

int main() {
    int m, n;
    cin >> m >> n;
    vector<int> levelOrd(n + 1);
    BinaryTree bt(n);
    for (int i = 0; i < m; i++) {
        for (int j = 1; j <= n; j++) {
            cin >> levelOrd[j];
        }
        bt.build(levelOrd);
        if (bt.isMaxHeap()) cout << "Max Heap" << endl;
        else if (bt.isMinHeap()) cout << "Min Heap" << endl;
        else cout << "Not Heap" << endl;
        vector<int> postOrd = bt.getPostOrder();
        cout << postOrd[0];
        for (int j = 1; j < postOrd.size(); j++)
            cout << " " << postOrd[j];
        cout << endl;
    }

    return 0;
}