我的PAT-ADVANCED代码仓:https://github.com/617076674/PAT-ADVANCED
原题链接:https://pintia.cn/problem-sets/994805342720868352/problems/1071785408849047552
题目描述:
题目翻译:
1155 堆路径
在计算机科学中,堆是一种专门的基于树的数据结构,它满足堆属性:如果P是C的父节点,则P的键(值)大于或等于(在最大堆中) 或者小于或等于(在最小堆中)C的键值。堆的常见实现是二叉堆,其中树是完全二叉树。(引自维基百科,网址为https://en.wikipedia.org/wiki/Heap_(data_structure))
有一点可以肯定的是,从最大/最小堆中的根到叶子的任何路径上的所有键一定处于非递增/非递减顺序。
你的任务是检查给定完整二叉树中的每个路径,以便判断它是否为堆。
输入格式:
每个输入文件包含一个测试用例。 对于每种情况,第一行给出正整数N(1 < N <= 1000),即树中的键数。然后下一行包含N个不同的整数键(全部在int范围内),它给出了完全二叉树的层序遍历序列。
输出格式:
对于每个给定的树,首先打印从根到叶的所有路径。每条路径占一行,所有数字用空格分隔,并且每行的开头或末尾没有额外的空格。必须按以下顺序打印路径:对于树中的每个节点,其右子树中的所有路径必须在其左子树中的路径之前打印。
最后,如果它是最大堆,则在一行中打印“Max Heap”,或者对于最小堆打印“Min Heap”,如果它根本不是堆,则打印在“Not Heap”。
输入样例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
输入样例3:
8
10 28 15 12 34 9 8 56
输出样例3:
10 15 8
10 15 9
10 28 34
10 28 12 56
Not Heap
知识点:堆、深度优先遍历
思路:深度优先遍历
用两个标记flag1和flag2分别用来判别最大堆或最小堆,初始化均为true。一旦在深度优先遍历的过程中发现不满足最大堆或最小堆的条件,则将相应的标记置为false。
时间复杂度和空间复杂度均是O(N)。
C++代码:
#include<iostream>
#include<vector>
using namespace std;
int N, levelOrder[1000];
bool flag1 = true, flag2 = true; //flag1用于判别最大堆,flag2用于判别最小堆
vector<int> path;
void dfs(int now);
int main(){
scanf("%d", &N);
for(int i = 0; i < N; i++){
scanf("%d", &levelOrder[i]);
}
dfs(0);
if(flag1){
printf("Max Heap\n");
}else if(flag2){
printf("Min Heap\n");
}else{
printf("Not Heap\n");
}
return 0;
}
void dfs(int now){
path.push_back(levelOrder[now]);
int lchild = now * 2 + 1, rchild = now * 2 + 2;
if(lchild >= N){
for(int i = 0; i < path.size(); i++){
printf("%d", path[i]);
if(i != path.size() - 1){
printf(" ");
}else{
printf("\n");
}
}
path.pop_back();
return;
}
if(rchild < N){
if(levelOrder[now] > levelOrder[rchild]){
flag2 = false;
}
if(levelOrder[now] < levelOrder[rchild]){
flag1 = false;
}
dfs(rchild);
}
if(lchild < N){
if(levelOrder[now] > levelOrder[lchild]){
flag2 = false;
}
if(levelOrder[now] < levelOrder[lchild]){
flag1 = false;
}
dfs(lchild);
}
path.pop_back();
}
C++解题报告: