由二叉树中序遍历和先序遍历,构造二叉树,经过镜面翻转后输出层次遍历结果

来源:互联网 发布:如何让淘宝导航条全屏 编辑:程序博客网 时间:2024/05/16 19:32
玩转二叉树 

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

输入格式:

输入第一行给出一个正整数N\le30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。

输出格式:

在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

输入样例:

71 2 3 4 5 6 74 1 3 2 6 5 7

输出样例:

4 6 1 7 5 3 2
题目地址:https://www.patest.cn/contests/gplt/L2-011
#include <iostream>#include <cstdio>#include <cmath>#include <queue>#include <stack>#include <map>#include <algorithm>#include <vector>#include <string>#include <cstring>#include <sstream>using namespace std;struct Btree{    int data;    Btree* left;    Btree* right;};typedef struct Btree Btree;int zhong[100];int xian[100];int n;int Find(int *zhong,int x,int len){    for(int i=0;i<len;i++)    {        if(zhong[i]==x)        {            return i;        }    }}Btree* build(int *zhong,int *xian,int len){    if(len<=0) return NULL;    Btree *tmp=new Btree;    tmp->data=xian[0];    int index=Find(zhong,xian[0],len);    tmp->left=build(zhong,xian+1,index);    tmp->right=build(zhong+index+1,xian+index+1,len-index-1);    return tmp;}void Reverse(Btree *root){    if(root==NULL) return;    Reverse(root->left);    Reverse(root->right);    Btree *tmp=root->left;    root->left=root->right;    root->right=tmp;}int ans[100];int cur;queue<Btree*> Q;void CenOrder(Btree *root){    Q.push(root);    while(!Q.empty())    {        Btree *tmp=Q.front();        Q.pop();        ans[cur++]=tmp->data;        if(tmp->left)        {            Q.push(tmp->left);        }        if(tmp->right)        {            Q.push(tmp->right);        }    }}int main(){    scanf("%d",&n);    for(int i=0;i<n;i++)    {        scanf("%d",&zhong[i]);    }    for(int i=0;i<n;i++)    {        scanf("%d",&xian[i]);    }    Btree *root=build(zhong,xian,n);    Reverse(root);    CenOrder(root);    for(int i=0;i<cur;i++)    {        if(i==0) printf("%d",ans[i]);        else printf(" %d",ans[i]);    }    printf("\n");    return 0;}


0 0