PTA 玩转二叉树 (25分)

释放无限光明的是人心,制造无边黑暗的也是人心,光明和黑暗交织着,厮杀着,这就是我们为之眷恋又万般无奈的人世间。

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

输入格式:

输入第一行给出一个正整数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 <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <ctime>
#include <cctype>
#include <bitset>
#include <utility>
#include <sstream>
#include <complex>
#include <iomanip>
#include<climits>//INT_MAX
//#include<bits/stdc++.h>
#define PP pair<ll,int>
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3fll
#define dinf 1000000000000.0
#define PI 3.1415926
typedef long long ll;
using namespace std;
int const mod=1e9+7;
const int maxn=1e4+10;
int N,zx[40],qx[40];
typedef struct node{
    int data;
    node *l,*r;
}kj,*tree;
void jtree(tree &t,int ks,int js,int cd){
    int ls;
    if(cd<=0){
        t=NULL;
        return ;
    }
    else{
        t=(tree)malloc(sizeof(kj));
        t->data=qx[ks];
        for(int i=0;i<N;i++){
            if(zx[i]==qx[ks]){
                ls=i;
                break;
            }
        }
        int cdf=ls-js;
        jtree(t->l,ks+1,js,cdf);
        int cdr=cd-1-cdf;
        jtree(t->r,ks+cdf+1,ls+1,cdr);
    }
    return ;
}
void fz(tree &t){
    if(t==NULL){
        return;
    }
    if(t->l!=NULL&&t->r!=NULL){
        tree temp;
        temp=t->l;
        t->l=t->r;
        t->r=temp;
    }
    else if(t->l==NULL&&t->r!=NULL){
        t->l=t->r;
        t->r=NULL;
    }
    else if(t->l!=NULL&&t->r==NULL){
        t->r=t->l;
        t->l=NULL;
    }
    fz(t->l);
    fz(t->r);
    return;
}
void cx(tree t){
    queue<tree> q;
    if(t!=NULL)
        q.push(t);
    while(!q.empty()){
        tree temp=q.front();
        cout<<temp->data;
        q.pop();
        if(temp->l!=NULL)
            q.push(temp->l);
        if(temp->r!=NULL)
            q.push(temp->r);
        if(!q.empty())
            cout<<' ';
    }
}
int main(){
    tree t;
    cin>>N;
    for(int i=0;i<N;i++)
        cin>>zx[i];
    for(int i=0;i<N;i++)
        cin>>qx[i];
    jtree(t,0,0,N);//建树
    fz(t);//翻转
    cx(t);//层序遍历输出
    cout<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44170305/article/details/108563425