题目地址
题目大意
给你一颗树,请输出这颗树从根结点到所有叶子节点的路径,并判断给出的二叉树是不是堆,如果是打印出是大堆还是小堆,如果不是打印不是堆。
解题思路
- 给出的树为完全二叉树,可以用数组存放,下标读取子结点。
- 打印树所有路径的过程其实就是DFS的过程。
- 可以用一个vector存放遍历得到的结点值,每次末尾追加,当访问到孩子结点时直接输出结果。注意子结点回到父结点时需要删除vector末尾元素,和栈的操作类似,但用vector存放可以方便顺序打印。
- 定义一个int变量作为标记符,第一次打印时确定是大堆还是小堆还是不是堆,从第二次打印开始每次都验证标记符是否与当次打印的结果相符。
完整代码
// A1155.cpp : Defines the entry point for the console application.
//
#include "stdio.h"
#include "vector"
using namespace std;
vector<int> haha;
vector<int> ans;
int n,flag = 0;
void jub(int i){
ans.push_back(haha[i]);
if(2*i+1 < haha.size()){
jub(2*i+1);
ans.pop_back();
}
if(2*i < haha.size()){
jub(2*i);
ans.pop_back();
}else{
int u = -1;
for(int i = 0;i < ans.size();i++){
if(i == 0){
printf("%d",ans[i]);
u = ans[i];
}else{
printf(" %d",ans[i]);
if(ans[i] > u){
if(flag == 0)
flag = 1;
if(flag == -1)
flag = 2;
}
if(ans[i] < u){
if(flag == 0)
flag = -1;
if(flag == 1)
flag = 2;
}
}
}
printf("\n");
return;
}
}
int main(int argc, char* argv[])
{
scanf("%d",&n);
haha.push_back(n);
while(n--){
int u;
scanf("%d",&u);
haha.push_back(u);
}
jub(1);
if(flag == 2 || haha.size() == 11) printf("Not Heap\n");
else if(flag == -1) printf("Max Heap\n");
else if(flag == 1) printf("Min Heap\n");
return 0;
}
总结
板子题,DFS类型题目,欢迎评论区交流讨论。