您的位置:首页 > 其它

L2-011. 玩转二叉树

2018-03-19 08:56 246 查看
题目:
给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。输入格式:输入第一行给出一个正整数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 <iostream>
#include <vector>
#include <queue>
using namespace std;
const int maxn=50;
int InOrder[maxn],PreOrder[maxn];
struct Node{//定义树的左右两个子树
int r,l;
}a[maxn];

// 中序遍历[l1....l2]先序遍历[r1....r2]
int build(int l1,int l2,int r1,int r2){
if(l1>l2) return 0;//空树
int root = PreOrder[r1];//定义根节点
int p = l1;
while(InOrder[p] != root) p++;//寻找根节点
int cnt = p-l1;
a[root].l = build(l1,p-1,r1+1,r1+cnt);//建立左子树
a[root].r= build(p+1,l2,r1+cnt+1,r2);//建立右子树
return root;
}
void bfs(int x){//层次(广度优先搜索)
queue<int>q;//队列
vector<int>v;//不等长数组
q.push(x);//将x压入队列
while(!q.empty()){
int w = q.front();//取队列首元素(不删除)
q.pop();//出队列
if(w == 0) break;//判空
v.push_back(w);//结果放在不等长数组中

if(a[w].r!=0){
q.push(a[w].r);
}
if(a[w].l!=0){
q.push(a[w].l);
}
}
int len = v.size();
for(int i=0;i<len;i++){//输出
printf("%d%c",v[i],i==len-1?'\n':' ');
}
return ;

}
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&InOrder[i]);
}
for(int i=0;i<n;i++){
scanf("%d",&PreOrder[i]);
}
build(0,n-1,0,n-1);//建树
int root = PreOrder[0];//找树根
bfs(root);//广度优先遍历
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  L2-011. 玩转二叉树