zoukankan      html  css  js  c++  java
  • PAT(Advanced Level)A1147. Heaps

    题意

    判断给定的完全二叉树是否为堆

    思路

    • 完全二叉树用静态存储,注意是从index 1开始放
    • 解决了怎么存储之后,接下来就是怎么判断堆的问题了❓
      • 看有没有破坏最大堆和最小堆的性质,破坏其中一个就是另一个,都破坏了说明根本不是堆,设置两个标志位
      • 也就是我们从第2个节点到最后,都反复检查当前节点和父节点的关系

    代码

    #include <iostream>
    #include <vector>
    #include <map>
    using namespace std;
    int max_heap, min_heap;
    int trees, keys;
    vector<int> path;
    // 判断是否为堆,改变对应标志位
    void judge(vector<int>& v) {
        for(int i = 2; i <= keys; i++) {
            if(v[i/2] > v[i])   min_heap = 0;   // 出现了父节点 > 孩子结点,不可能是最小堆
            if(v[i/2] < v[i])   max_heap = 0;   // 出现了父节点 < 孩子结点,不可能是最大堆
        }
    }
    // 后序遍历,用vector来存放结果
    void post_travel(vector<int>& v, int index) {
        if(index <= keys) {
            post_travel(v, index * 2);
            post_travel(v, index * 2 + 1);
            path.emplace_back(v[index]);
        }
    }
    int main() {
        cin >> trees >> keys;
        vector<int> my_tree;
        for(int i = 0; i < trees; i++) {
            my_tree.clear();
            my_tree.resize(keys + 1);
            for(int j = 1; j <= keys; j++)   cin >> my_tree[j];
            max_heap = 1;
            min_heap = 1;
            judge(my_tree);
            path.clear();
            
            if(max_heap == 1 && min_heap == 0) {
                cout << "Max Heap
    ";
                post_travel(my_tree, 1);
                for(int i = 0; i < path.size() - 1; i++) {
                    cout << path[i] << " ";
                }
                cout << path.back();
            }else if(max_heap == 0 && min_heap == 1) {
                cout << "Min Heap
    ";
                post_travel(my_tree, 1);
                for(int i = 0; i < path.size() - 1; i++) {
                    cout << path[i] << " ";
                }
                cout << path.back();
            }else {
                cout << "Not Heap
    ";
                post_travel(my_tree, 1);
                for(int i = 0; i < path.size() - 1; i++) {
                    cout << path[i] << " ";
                }
                cout << path.back();
            }
            if(i != trees - 1)  cout << endl;
        }
      	return 0;
    }
    
    如有转载,请注明出处QAQ
  • 相关阅读:
    数据结构之排序七:归并排序
    数据结构之排序六:快速排序
    在MFC中显示cmd命令行
    一次性无重复配置VS项目插件属性的方法
    mysql & vs2013
    matlab 图像Mat类型矩阵中的值(uint8)类型转换,防止溢出
    利用vs10和opencv识别图片类型身份证的号码
    static
    Filter2D卷积运算
    opencv 矩阵类数据的运算
  • 原文地址:https://www.cnblogs.com/MartinLwx/p/14479682.html
Copyright © 2011-2022 走看看