PAT(Advanced)1155 Heap Paths C++实现

PAT(Advanced)甲级1155 Heap Paths C++实现

题目链接

1155 Heap Paths

题目大意

给定一组完全二叉树的层次遍历序列,输出从根节点到叶子节点的所有序列,右子树路径打印在左子树路径前,并判断给定的完全二叉树是满足堆性质,若为最大堆输出Max Heap,若为最小堆则输出Min Heap,若不是堆则输出Not Heap

算法思路

根据题意,给定完全二叉树的层次遍历序列,利用二叉树顺序存储结构,进行先序遍历,设置vector<int>整型动态数组answer,以及vector<vector<int> >二维动态数组answers,递归地,对于每个节点将其存入answer中,若到达叶子节点,将answer加入answers,回溯继续遍历,先遍历右子树再遍历左子树,根据堆性质,求得的序列若递增有序则为最大堆,若递减有序则为最小堆,否则不是堆结构,根据该性质即可判断给定的完全二叉树是否为堆结构

/*
author : eclipse
email  : eclipsecs@qq.com
time   : Sun Jun 28 17:25:19 2020
*/
#include <bits/stdc++.h>
using namespace std;

vector<int> binaryTree;
vector<vector<int> > answers;

void preOrderTraverse(int p, vector<int> answer) {
    if (p >= binaryTree.size()) {
        return;
    }
    int left = 2 * p;
    int right = 2 * p + 1;
    answer.push_back(binaryTree[p]);
    if (left >= binaryTree.size() && right >= binaryTree.size()) {
        answers.push_back(answer);
        return;
    }
    preOrderTraverse(right, answer);
    preOrderTraverse(left, answer);
}

bool maxHeap() {
    for (int i = 0; i < answers.size(); i++) {
        for (int j = 0; j < answers[i].size() - 1; j++) {
            if (answers[i][j] < answers[i][j + 1]) {
                return false;
            }
        }
    }
    return true;
}

bool minHeap() {
    for (int i = 0; i < answers.size(); i++) {
        for (int j = 0; j < answers[i].size() - 1; j++) {
            if (answers[i][j] > answers[i][j + 1]) {
                return false;
            }
        }
    }
    return true;
}

void print() {
    for (int i = 0; i < answers.size(); i++) {
        printf("%d", answers[i][0]);
        for (int j = 1; j < answers[i].size(); j++) {
            printf(" %d", answers[i][j]);
        }
        printf("\n");
    }
    if (maxHeap()) {
        printf("Max Heap");
    } else if (minHeap()) {
        printf("Min Heap");
    } else {
        printf("Not Heap");
    }
}

int main(int argc, char const *argv[]) {
    int N;
    scanf("%d", &N);
    binaryTree.resize(N + 1);
    for (int i = 1; i < binaryTree.size(); i++) {
        scanf("%d", &binaryTree[i]);
    }
    vector<int> answer;
    preOrderTraverse(1, answer);
    print();
    return 0;
}

样例输入1

8
98 72 86 60 65 12 23 50

样例输出1

98 86 23
98 86 12
98 72 65
98 72 60 50
Max Heap

样例输入2

8
8 38 25 58 52 82 70 60

样例输出2

8 25 70
8 25 82
8 38 52
8 38 58 60
Min Heap

样例输入2

8
10 28 15 12 34 9 8 56

样例输出2

10 15 8
10 15 9
10 28 34
10 28 12 56
Not Heap

鸣谢

PAT

最后

  • 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值