L2-011 玩转二叉树 (25 分)
给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N
(≤30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
| 7 1 2 3 4 5 6 7 4 1 3 2 6 5 7
|
输出样例:
程序源代码:
镜面反转即为在层序遍历时交换左右子树的遍历顺序,左->右变成右->左
前序 + 中序 建树 + BFS
建树详细过程:
由遍历顺序构建二叉树(前序+中序;后序+中序) - 计算机奇妙之旅 (xingyuanjie.top)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| #include <bits/stdc++.h> using namespace std; typedef struct BiTNode{ int data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; int n; int in[35]; int pre[35]; BiTree PostCreate(int prel,int prer,int inl,int inr){ if(prel>prer){ return NULL; } BiTNode *root; root=(BiTNode*)malloc(sizeof(BiTNode)); root->data=pre[prel]; int index=0; for (int i = inl; i <=inr; ++i) { if(pre[prel]==in[i]){ index=i; break; } } int numleft=index-inl; root->lchild=PostCreate(prel+1,prel+numleft,inl,index-1); root->rchild=PostCreate(prel+numleft+1,prer,index+1,inr); return root; } void LevelOrder(BiTree T) { queue<BiTree> q; q.push(T); int i=0; while (!q.empty()){ BiTNode *tmp =q.front(); q.pop(); if(i!=n-1){ cout<<tmp->data<<" "; }else{ cout<<tmp->data; } i++; if(tmp->rchild!=NULL){ q.push(tmp->rchild); } if(tmp->lchild!=NULL){ q.push(tmp->lchild); } } } int main() { BiTree tree; tree=NULL; cin>>n; for (int i = 0; i <n ; ++i) { cin>>in[i]; } for (int j = 0; j <n ; ++j) { cin>>pre[j]; } tree=PostCreate(0,n-1,0,n-1); LevelOrder(tree); cout<<endl; return 0; }
|
参考资料:
题目详情 - L2-011 玩转二叉树 (25 分) (pintia.cn)
由遍历顺序构建二叉树(前序+中序;后序+中序) - 计算机奇妙之旅 (xingyuanjie.top)