天天看点

PAT 1155 Heap Paths (30 分)c++

题目:

题目大意: 给一个二叉树判断是否是最大或最小堆. 这道题考察的知识点是递归和dfs, 通过一次深度优先的遍历就可以把所有路径找出来, 每找出一个路径就判断一下是不是递减, 是不是递增.

注意递归题目中, 重点关注边界条件–到达叶节点, 递归式–最小堆的数组存储, 从1开始, 第i个元素的左儿子是i2, 右儿子是2i + 1.

#include<cstdio>
#include<iostream>
#include<vector>
#define pb push_back 
using namespace std;
int tree[1005];
int n;
bool max_flag = true, min_flag = true;
vector<int> temp_path;

void dfs(int i) {
    temp_path.pb(tree[i]);
    if ( i * 2 > n) {
        for(int i = 0; i < temp_path.size(); i++) {
            printf("%d", temp_path[i]);
            if (i > 0) {
                if (max_flag)
                    max_flag = temp_path[i-1] >= temp_path[i];
                if (min_flag)
                    min_flag = temp_path[i-1] <= temp_path[i];
            }
            if (i + 1 != temp_path.size()) printf(" ");
            else printf("\n");
        }
    }
    else {
        if (i * 2 + 1 <= n) dfs(i * 2 + 1);
        if (i * 2 <= n) dfs(i * 2);
    }
    temp_path.pop_back();
}

int main() {
    scanf("%d", &n);	
    for (int i = 1; i <= n; i++) {
        scanf("%d", &tree[i]);
    }
    dfs(1);
    if (max_flag) printf("Max Heap");
    else if (min_flag) printf("Min Heap");
    else printf("No Heap"); 
    system("pause;");
    return 0;
}