您的位置:首页 > 其它

团体程序设计天梯赛-练习集L2-011 玩转二叉树(构造二叉树+BFS)

2016-06-16 00:26 330 查看

L2-011. 玩转二叉树

时间限制
400 ms

内存限制
65536 kB

代码长度限制
8000 B

判题程序
Standard

作者
陈越

给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。

输入格式:

输入第一行给出一个正整数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

大体题意:
给你二叉树的中序遍历和前序遍历,然后再将所有非叶结点左右孩子对换,最后层序遍历输出。
思路:
分析下样例,思路很明确,先根据中序遍历和前序遍历用链表的方式构造出二叉树,然后再层序遍历输出即可,只不过这里的层序遍历是先右后左的方式。
构造二叉树用结构体递归做,层序遍历直接bfs即可!
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int *pre,*in,n;
int *ans;
int cnt;
struct Node{
int v;
Node* left,*right;
}*root;
queue<Node*>q;
int cnt2 = 0;
Node *build(int *pre,int *in,int len){
if (len == 0)return NULL;
Node * node = new Node;
node->v = *pre;
++cnt2;
if (cnt2==1)root = node;
int rootdex = 0;
for (; rootdex < n; ++rootdex)if (in[rootdex] == *pre)break;
node->left = build(pre+1,in,rootdex);
node->right = build(pre+1+rootdex,in+rootdex+1,len-rootdex-1);
return node;
}
void print(){
while(!q.empty())q.pop();
q.push(root);
while(!q.empty()){
Node *u = q.front();q.pop();
ans[cnt++] = u->v;
if (u->right != NULL)q.push(u->right);
if (u->left != NULL)q.push(u->left);

}
for (int i = 0; i < cnt; ++i){
if (i)printf(" ");
printf("%d",ans[i]);
}
}
int main(){
scanf("%d",&n);
pre = new int
;
in = new int
;
ans = new int
;
cnt = 0;
for (int i = 0; i < n; ++i)scanf("%d",&in[i]);
for (int i = 0; i < n; ++i)scanf("%d",&pre[i]);
build(pre,in,n);
print();
return 0;
}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: