L2-011. 玩转二叉树
2017-03-14 17:52
169 查看
给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(<=30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
输出样例:
输入格式:
输入第一行给出一个正整数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 <queue> #include<iostream> #include<stdio.h> #include <string.h> #include <math.h> #include <algorithm> using namespace std; int q1[50]; int q2[50]; struct ttt{ int w,l,r; }; ttt q3[50]; int tt; int fun(int x,int y,int k,int m){ int f1,f2,f3; f1=x; f2=0; //cout << x << "---~~" << y << " "<<f2<<endl; if(x>y)return 0; while(f1<=y){ if(q1[f1]==q2[tt+1]){ f2=f1; break; } f1++; } if(f1>y)return 0; //cout << x << "---" << y << " "<<f2<<endl; tt++; q3[tt].w=q1[f2]; if(k==0){ q3[m].l=tt; //cout << m << "-----的左边是" << tt <<endl; }else if(k==1){ q3[m].r=tt; //cout << m << "-----的右边是" << tt <<endl; } m=tt; fun(x,f2-1,0,m); fun(f2+1,y,1,m); } int dfs(int k){ int b=0; if(q3[k].r!=0){ dfs(q3[k].r); b=1; } if(q3[k].l!=0){ dfs(q3[k].l); b=1; } if(b==1){ swap(q3[k].l,q3[k].r); } } int main(){ // freopen("in.txt","r",stdin); int i,j,k,l,f1,f2,f3,t1,t2,t3,m; int l1,l2,l3,f4,f5; int n,sum1; cin >> n; memset(q1,0,sizeof(q1)); memset(q2,0,sizeof(q2)); memset(q3,0,sizeof(q3)); for(i=1;i<=n;i++){ cin >> q1[i]; } for(i=1;i<=n;i++){ cin >> q2[i]; } tt=0; fun(1,n,-1,0); dfs(1); /*for(i=1;i<=n;i++) cout << i << " " << q3[i].w << " " << q3[i].l << " "<< q3[i].r <<endl; cout << "aaa" <<endl; for(i=1;i<=n;i++) cout << i << " " << q3[i].w << " " << q3[i].l << " "<< q3[i].r <<endl; */ int u=1; queue<int>gg; gg.push(u); k=0;; while(!gg.empty()){ k++; u=gg.front();gg.pop(); if(k==1) cout << q3[u].w; else cout << " " << q3[u].w; if(q3[u].l!=0)gg.push(q3[u].l); if(q3[u].r!=0)gg.push(q3[u].r); } return 0; }
相关文章推荐
- PAT L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- PAT ~ L2-011. 玩转二叉树 (树的遍历互求 + 交换左右节点)
- L2-006. 树的遍历&&L2-011. 玩转二叉树
- 天梯赛 L2-011. 玩转二叉树(数据结构)
- PAT - L2-011. 玩转二叉树(分冶)
- 团体程序设计天梯赛-练习集L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- PAT(天梯赛练习题) -L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树(先序中序求后序)
- L2-011. 玩转二叉树
- L2-011. 玩转二叉树