给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数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 <cstdio> #include <algorithm> #include <iostream> #include <set> #include<queue> #include<cstring> #include<string> #include<cstdio> using namespace std; int md[55]; int sd[55]; queue<int>q; struct node { int l,r; }tree[355]; int build(int la,int ra,int lb,int rb) { if(lb>rb)return 0; int rt=sd[la],p1=lb,p2; while(md[p1]!=rt)p1++; p2=p1-lb; tree[rt].l=build(la+1,la+p2,lb,p1-1); tree[rt].r=build(la+p2+1,ra,p1+1,rb); return rt; } int a[355]; int ans=1; void bfs(int root) { q.push(root); while(!q.empty()) { int v=q.front();q.pop(); a[ans++]=v; if(tree[v].r) q.push(tree[v].r); if(tree[v].l) q.push (tree[v].l); } } int main() { int n; cin>>n; for(int i=1;i<=n;i++) cin>>md[i]; for(int i=1;i<=n;i++) cin>>sd[i]; build(1,n,1,n); bfs(sd[1]); for(int i=1;i<=ans-1;i++) { cout<<a[i]; if(i!=ans-1) cout<<" "; } return 0; }
给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数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 <cstdio> #include <algorithm> #include <iostream> #include <set> #include<queue> #include<cstring> #include<string> #include<cstdio> using namespace std; int md[55]; int sd[55]; queue<int>q; struct node { int l,r; }tree[355]; int build(int la,int ra,int lb,int rb) { if(lb>rb)return 0; int rt=sd[la],p1=lb,p2; while(md[p1]!=rt)p1++; p2=p1-lb; tree[rt].l=build(la+1,la+p2,lb,p1-1); tree[rt].r=build(la+p2+1,ra,p1+1,rb); return rt; } int a[355]; int ans=1; void bfs(int root) { q.push(root); while(!q.empty()) { int v=q.front();q.pop(); a[ans++]=v; if(tree[v].r) q.push(tree[v].r); if(tree[v].l) q.push (tree[v].l); } } int main() { int n; cin>>n; for(int i=1;i<=n;i++) cin>>md[i]; for(int i=1;i<=n;i++) cin>>sd[i]; build(1,n,1,n); bfs(sd[1]); for(int i=1;i<=ans-1;i++) { cout<<a[i]; if(i!=ans-1) cout<<" "; } return 0; }