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
 
原文地址:https://www.cnblogs.com/ydw--/p/10569543.html