给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N
(≤30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
1. 7 2. 1 2 3 4 5 6 7 3. 4 1 3 2 6 5 7
结尾无空行
输出样例:
4 6 1 7 5 3 2
结尾无空行
#include<iostream> #include<queue> using namespace std; typedef struct node *tree; struct node{ tree left,right; int data; }; int a[40],b[40],n; tree build(int a[],int b[],int len)//根据前序和中序建树过程 { if(!len) return NULL;//空树 int i; for(i=0;i<len;i++) if(b[i]==a[0]) break;//找到中序的根节点 tree t=(tree)new(tree);//创建一个节点 t->data=a[0];//根 t->left=build(a+1,b,i);//左 t->right=build(a+i+1,b+i+1,len-i-1);//右 return t; } int main() { cin>>n; for(int i=0;i<n;i++) cin>>b[i];//中 for(int i=0;i<n;i++) cin>>a[i];//前 tree t=build(a,b,n); queue<tree>q; q.push(t); int f=0; while(!q.empty())//层次遍历 { tree x=q.front(); q.pop(); if(f++) cout<<' ';//控制空格 cout<<x->data; if(x->right) q.push(x->right); if(x->left) q.push(x->left); } return 0; }