4523: 【作】【基础】二叉树遍历(2203)
内存限制:128 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:1
解决:1
题目描述
小明学完了树的基本知识,想做二叉树遍历的程序设计练习。
根据二叉树的深度从数据文件中读入 个整数生成顺序存储的二叉树,做各种遍历的输出。小明发现输出的数据中有不少重复的,为此他先将重复的数据过滤掉,然后再生成二叉树的结构。
现在要求你从数据文件中读取若干个整数,生成一个满二叉树,然后输出一个二叉树遍历的序列。
输入
输入包含 行;
第一行是两个整数 和 , 是二叉树的深度, 。时先序输出, 时中序输出, 时后序输出。
第二行若干个整数(数字小于等于 ),读入数据前,先要计算二叉树的结点个数 ,然后在数据中顺序读取 个不重复的整数。
例如深度为 的二叉树结点有 个。
输出
输出文只有一行,是二叉树遍历的序列。
样例输入 复制
3 2
277 248 494 88 277 371 387 88 494 216 227
样例输出 复制
88 248 371 277 387 494 216
提示
【样例解释】
样例数据构建的二叉树为:
#include<bits/stdc++.h>
using namespace std;
int h,p,a[1000],n;
void dfs1(int x) {
cout<<a[x]<<" ";
if (2*x<=n&&a[2*x]!=0) dfs1(2*x);
if (2*x+1<=n&&a[2*x+1]!=0) dfs1(2*x+1);
}
void dfs2(int x) {
if (2*x<=n&&a[2*x]!=0) dfs2(2*x);
cout<<a[x]<<" ";
if (2*x+1<=n&&a[2*x+1]!=0) dfs2(2*x+1);
}
void dfs3(int x) {
if (2*x<=n&&a[2*x]!=0) dfs3(2*x);
if (2*x+1<=n&&a[2*x+1]!=0) dfs3(2*x+1);
cout<<a[x]<<" ";
}
int main(){
cin>>n>>p;
n=int(pow(2,n))-1;
cin>>a[1];
int cnt=1;
int t;
while (cin>>t){
bool flag=false;
for (int j=1;j<=cnt;j++) {
if (a[j]==t) {
flag=true;
break;
}
}
if (!flag) a[++cnt]=t;
}
if (p==1) dfs1(1);
else if (p==2) dfs2(1);
else if (p==3) dfs3(1);
return 0;
}