5-11 玩转二叉树 (数据结构)

来源:互联网 发布:淘宝充值比官方便宜 编辑:程序博客网 时间:2024/06/03 22:05

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

输入格式:

输入第一行给出一个正整数N(\le≤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 <vector>#include <queue>using namespace std;#define M 10010int mid[M], fir[M];struct node{    int l, r;};node a[M];int build(int la, int ra, int lb, int rb)//建立二叉树{    if(la > ra)    {        return 0;    }    int p1, p2, rt;    p1 = la;    rt = fir[lb];//先序遍历的第一个点事根    while(mid[p1] != rt)    {        p1++;//找出左子树的范围    }    p2 = p1 - la;//记录一个子树的范围    a[rt].l = build(la, p1-1, lb+1, lb+p2);//左子树    a[rt].r = build(p1+1, ra, lb+p2+1, rb);//右子树    return rt;//返回根节点}void bfs(int rt){    queue<int> q;    q.push(rt);    vector<int> vec;    while(!q.empty())    {        int x = q.front();        q.pop();        if(x == 0)        {            continue;        }        vec.push_back(x);        if(a[x].r != 0)//交叉变换所以先遍历右子树        {            q.push(a[x].r);        }        if(a[x].l != 0)        {            q.push(a[x].l);        }    }    int len = vec.size();    for(int i=0; i<len; i++)    {        printf("%d%c", vec[i], i==len-1 ? '\n' : ' ');    }}int main(){    int n;    scanf("%d", &n);    for(int i=0; i<n; i++)    {        scanf("%d", &mid[i]);    }    for(int i=0; i<n; i++)    {        scanf("%d", &fir[i]);    }    int root = fir[0];    build(0, n-1, 0, n-1);    bfs(root);    return 0;}
0 0
原创粉丝点击