• L2-011 玩转二叉树 (中前序推层序


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

    输入格式:

    输入第一行给出一个正整数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<bits/stdc++.h>
    using namespace std;
    int q[101],z[101],n;
    struct node{
        int data;
        struct node *l,*r;
    };
    node *build(int l1,int r1,int l2,int r2)//z,q
    {
        if(l1>r1||l2>r2)return NULL;
        node *root=new node;
        root->data=q[l2];
        int i,k=0;
        for(i=l1;i<=r1;i++){
            if(z[i]==q[l2])break;
            else k++;//左子树有k个节点
        }
        root->l=build(l1,l1+k-1,l2+1,l2+k);
        root->r=build(l1+k+1,r1,l2+k+1,r2);
        return root;
    }
    void bfs(node *root)
    {
        int i;
        queue<node*>qu;
        qu.push(root);
        int k=0;
        while(!qu.empty()){
            node *t=qu.front();
            qu.pop();
            k++;if(k!=1)printf(" ");
            printf("%d",t->data);
            if(t->r!=NULL)qu.push(t->r);//镜像
            if(t->l!=NULL)qu.push(t->l);
        }
    }
    int main(){
        int i;scanf("%d",&n);
        for(i=0;i<n;i++)scanf("%d",&z[i]);
        for(i=0;i<n;i++)scanf("%d",&q[i]);
        node *root=build(0,n-1,0,n-1);
        bfs(root);
        return 0;
    }
    View Code
     
  • 相关阅读:
    入门菜鸟
    FZU 1202
    XMU 1246
    Codeforces 294E Shaass the Great 树形dp
    Codeforces 773D Perishable Roads 最短路 (看题解)
    Codeforces 814E An unavoidable detour for home dp
    Codeforces 567E President and Roads 最短路 + tarjan求桥
    Codeforces 567F Mausoleum dp
    Codeforces 908G New Year and Original Order 数位dp
    Codeforces 813D Two Melodies dp
  • 原文地址:https://www.cnblogs.com/ydw--/p/10569543.html
Copyright © 2020-2023  润新知