代码:
//有先序,中序得到层次遍历序列
//再输出反转后的层序遍历
#include<bits/stdc++.h>
using namespace std;
#define N 35
int mid[N],pre[N];
int n;
int t=0;
int tree[N*N],tree1[N*N];
void creatT(int *pre,int *mid,int n,int index)
{
if(n==0)
return ;
int k=0;
while(pre[0]!=mid[k])
k++;
tree[index]=pre[0]; //用数组模拟树,树的结点从1开始
creatT(pre+1,mid,k,index*2); //构造左子树
creatT(pre+k+1,mid+k+1,n-k-1,index*2+1); //构造右子树
}
void level()
{
queue<int>q;
q.push(1);
while(q.size())
{
int p=q.front();
q.pop();
tree1[t++]=tree[p];
if(tree[p*2+1]!=0) //因为题意要求,先输出右边,再输出左边
q.push(p*2+1);
if(tree[p*2]!=0)
q.push(p*2);
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
cin>>mid[i];
for(int i=0;i<n;i++)
cin>>pre[i];
creatT(pre,mid,n,1); //从下标1开始,n表示这两个数组的长度为n
level();
cout<<tree1[0];
for(int i=1;i<t;i++)
{
cout<<" "<<tree1[i];
}
}
题目:
给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数
N
(≤30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。输出格式:
在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
7 1 2 3 4 5 6 7 4 1 3 2 6 5 7
输出样例:
4 6 1 7 5 3 2