团体程序设计天梯赛——玩转二叉树(遍历构造二叉树)

来源:互联网 发布:apache tomcat 8.5.6 编辑:程序博客网 时间:2024/04/30 23:08

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

输入格式:

输入第一行给出一个正整数N(\le≤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 <cstring>#include <string>#include <vector>#include <queue>#include <cstdio>#include <set>#include <math.h>#include <algorithm>#include <queue>#include <iomanip>#define INF 0x3f3f3f3f#define MAXN 10005#define Mod 123456789using namespace std;struct Node{    int num;    Node *lchild,*rchild;};int mid[50],pre[50],n;void build(int l,int r,int pl,Node *&head){    int p=pl;    for(int i=l; i<=r; ++i)        if(pre[p]==mid[i])        {            Node *tree=new Node;            tree=head;            tree->num=pre[p];            tree->lchild=new Node;            tree->rchild=new Node;            build(l,i-1,p+1,tree->lchild);            build(i+1,r,p+i-l+1,tree->rchild);            return;        }    head=NULL;    return;}void print(Node *head){    queue<Node> q;    cout<<head->num;    if(head->rchild!=NULL)        q.push(*(head->rchild));    if(head->lchild!=NULL)        q.push(*(head->lchild));    while(!q.empty())    {        Node tmp=q.front();        q.pop();        cout<<" "<<tmp.num;        if(tmp.rchild!=NULL)            q.push(*(tmp.rchild));        if(tmp.lchild!=NULL)            q.push(*(tmp.lchild));    }}int main(){    scanf("%d",&n);    for(int i=1; i<=n; ++i)        scanf("%d",&mid[i]);    for(int i=1; i<=n; ++i)        scanf("%d",&pre[i]);    Node *head=new Node;    build(1,n,1,head);    print(head);    return 0;}
0 0
原创粉丝点击