zoukankan      html  css  js  c++  java
  • 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
     
  • 相关阅读:
    8626 原子量计数
    17229 Lry,你除了2还是2
    11153 kill boss
    1143 多少个Fibonacci数
    8614 素数__
    We Chall-Training: Stegano I-Writeup
    We Chall-Training: Get Sourced-Writeup
    We Chall-Prime Factory-Writeup
    CTF入门指南
    pwnable.kr-collision -Writeup
  • 原文地址:https://www.cnblogs.com/ydw--/p/10569543.html
Copyright © 2011-2022 走看看