给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数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类似后序中序建立二叉树。同样用数组模拟所有叶节点。因为要求是反转后的层序遍历结果,所以建立叶节点时叶的数值需要左右对调一下。原来右儿子的节点值给左儿子,不是节点的那个data,是节点的值,比如第几个节点。
代码如下:
//
// main.cpp
// L2-011. 玩转二叉树
//
// Created by 徐智豪 on 2017/4/11.
// Copyright © 2017年 徐智豪. All rights reserved.
//
#include <iostream>
#include <stdio.h>
using namespace std;
int previs[100],midvis[100];
int N;
int level[10000]={0},vis[10000]={0};
struct node
{
int data;
node *l,*r;
};
int find(int x)
{
int i=1;
while(midvis[i]!=x)
i++;
return i;
}
void buildtree(int root,int start,int end,int index)
{
if(start>end)
return ;
level[index]=previs[root];
int i=find(previs[root]);
buildtree(root+1,start,i-1,index*2+2);
buildtree(root+i-start+1,i+1,end,index*2+1);
}
void print( )
{
int count=0;
int i;
for(i=0;i<10000;i++)
{
if(level[i]!=0)
{
if(count==N-1)
break ;
cout<<level[i]<<" ";
count++;
}
}
cout<<level[i]<<endl;
return ;
}
int main(int argc, const char * argv[]) {
scanf("%d",&N);
for(int i=1;i<=N;i++)
{
cin>>midvis[i];
}
for(int i=1;i<=N;i++)
{
cin>>previs[i];
}
buildtree(1,1,N,0);
print();
return 0;
}