玩转二叉树
给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数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
题目地址:https://www.patest.cn/contests/gplt/L2-011
#include <iostream> #include <cstdio> #include <cmath> #include <queue> #include <stack> #include <map> #include <algorithm> #include <vector> #include <string> #include <cstring> #include <sstream> using namespace std; struct Btree { int data; Btree* left; Btree* right; }; typedef struct Btree Btree; int zhong[100]; int xian[100]; int n; int Find(int *zhong,int x,int len) { for(int i=0;i<len;i++) { if(zhong[i]==x) { return i; } } } Btree* build(int *zhong,int *xian,int len) { if(len<=0) return NULL; Btree *tmp=new Btree; tmp->data=xian[0]; int index=Find(zhong,xian[0],len); tmp->left=build(zhong,xian+1,index); tmp->right=build(zhong+index+1,xian+index+1,len-index-1); return tmp; } void Reverse(Btree *root) { if(root==NULL) return; Reverse(root->left); Reverse(root->right); Btree *tmp=root->left; root->left=root->right; root->right=tmp; } int ans[100]; int cur; queue<Btree*> Q; void CenOrder(Btree *root) { Q.push(root); while(!Q.empty()) { Btree *tmp=Q.front(); Q.pop(); ans[cur++]=tmp->data; if(tmp->left) { Q.push(tmp->left); } if(tmp->right) { Q.push(tmp->right); } } } int main() { scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&zhong[i]); } for(int i=0;i<n;i++) { scanf("%d",&xian[i]); } Btree *root=build(zhong,xian,n); Reverse(root); CenOrder(root); for(int i=0;i<cur;i++) { if(i==0) printf("%d",ans[i]); else printf(" %d",ans[i]); } printf("\n"); return 0; }