描述
给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入
输入第一行给出一个正整数N(N≤30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。
输出
在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
样例输入
样例输出
解题思路
解题思路对于一棵树来说前序的第一个是树的根,记录下来然后到中序里面去找
中序的左边做左子树,右边为为右子树,然后递归建树
菜鸡的成长史
觉得写的对你有帮助的关注下^-^
#include <bits/stdc++.h> using namespace std; int Qi[50],Zh[50]; struct Node { int data; Node* left; Node* right; }; Node* creat(int ZL,int ZR,int QL,int QR) { //ZL中序左边 ZR中序右边 QL前序左边 QR前序右边 if(QL>QR) return NULL; //返回条件 Node *root=new Node; root->data=Qi[QL]; int biaoji; for(int i=0;i<=ZR;i++) { if(Zh[i]==Qi[QL]) //找出根节点在中序遍历的位置 {biaoji=i;break;} } int geshu=biaoji-ZL; //左子树 有几个 root->left=creat(ZL,biaoji-1,QL+1,QL+geshu); root->right=creat(biaoji+1,ZR,QL+geshu+1,QR); //递归建树 理解表层不要深究里面的 return root; //对递归的理解有推出条件,思路理清就行 ^-^菜鸡的理解 } void printtf(Node *tree) //层次遍历 { queue<Node*> que; que.push(tree); int flag=0; while(!que.empty()) { Node *e=que.front(); que.pop(); if(flag!=0) cout << " "; cout << e->data;flag=1; if(e->right!=NULL) //镜面反转:本来左到右 现在右到左 que.push(e->right); if(e->left!=NULL) que.push(e->left); } cout << endl; } int main() { int n; cin>>n; for(int i=0;i<n;i++) cin>>Zh[i]; for(int i=0;i<n;i++) cin>>Qi[i]; Node *tree=creat(0,n-1,0,n-1); printtf(tree); return 0; }
不懂的可以访问下这个帮助理解
http://www.cnblogs.com/liujinghuan/p/5842487.html