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

12 篇文章 0 订阅
10 篇文章 0 订阅

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[n];
    in = new int[n];
    ans = new int[n];
    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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值