给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入第一行给出一个正整数N
(/le≤30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。
在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
71 2 3 4 5 6 74 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;}
新闻热点
疑难解答