L2-011 玩转二叉树 (中前序推层序
给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数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
#include<bits/stdc++.h> using namespace std; int q[101],z[101],n; struct node{ int data; struct node *l,*r; }; node *build(int l1,int r1,int l2,int r2)//z,q { if(l1>r1||l2>r2)return NULL; node *root=new node; root->data=q[l2]; int i,k=0; for(i=l1;i<=r1;i++){ if(z[i]==q[l2])break; else k++;//左子树有k个节点 } root->l=build(l1,l1+k-1,l2+1,l2+k); root->r=build(l1+k+1,r1,l2+k+1,r2); return root; } void bfs(node *root) { int i; queue<node*>qu; qu.push(root); int k=0; while(!qu.empty()){ node *t=qu.front(); qu.pop(); k++;if(k!=1)printf(" "); printf("%d",t->data); if(t->r!=NULL)qu.push(t->r);//镜像 if(t->l!=NULL)qu.push(t->l); } } int main(){ int i;scanf("%d",&n); for(i=0;i<n;i++)scanf("%d",&z[i]); for(i=0;i<n;i++)scanf("%d",&q[i]); node *root=build(0,n-1,0,n-1); bfs(root); return 0; }