pat 1127. ZigZagging on a Tree

来源:互联网 发布:贵州大数据平台 编辑:程序博客网 时间:2024/06/05 10:37

原题链接:https://www.patest.cn/contests/pat-a-practise/1127



1127. ZigZagging on a Tree (30)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree can be determined by a given pair of postorder and inorder traversal sequences. And it is a simple standard routine to print the numbers in level-order. However, if you think the problem is too simple, then you are too naive. This time you are supposed to print the numbers in "zigzagging order" -- that is, starting from the root, print the numbers level-by-level, alternating between left to right and right to left. For example, for the following tree you must output: 1 11 5 8 17 12 20 15.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (<= 30), the total number of nodes in the binary tree. The second line gives the inorder sequence and the third line gives the postorder sequence. All the numbers in a line are separated by a space.

Output Specification:

For each test case, print the zigzagging sequence of the tree in a line. All the numbers in a line must be separated by exactly one space, and there must be no extra space at the end of the line.

Sample Input:
812 11 20 17 1 15 8 512 20 17 11 15 8 5 1
Sample Output:
1 11 5 8 17 12 20 15




#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <map>#include <vector>#include <set>#include <string>#include <queue>#include <stack>using namespace std;struct node{    int num;    node *lc,*rc;    int step;    node() {}    node(int num, node *lc, node *rc,int step):num(num), lc(lc), rc(rc), step(step) {}};int a[35],b[35];vector<int> vt[35];int n;void build(int pos,int l,int r,node *&rt){    int i,tmp=-1;    for(i=l; i<=r; i++)//注意每次在l~r区间内搜,而不是在1~n区间内搜    {        if(a[i]==b[pos])        {            tmp=i;            break;        }    }    if(tmp==-1)//必须保证pos没有超过l~r的范围,,如果没有搜到,就是超过了(也可以直接判断if(l>r))        return ;    //rt=(struct node *)malloc(sizeof(struct node));    //rt->num=b[pos];    //rt->lc=NULL;    //rt->rc=NULL;    rt=new node(b[pos],NULL,NULL,0);    if(tmp>l)        build(pos-(r-tmp)-1,l,tmp-1,rt->lc);//注意每次的pos是后序遍历(前序遍历)的根节点位置,,是辅助中序序列找根节点位置的(找左右子树根节点位置时,都要在l~r区间的基础上找)    if(tmp<r)        build(pos-1,tmp+1,r,rt->rc);}void bfs(node *rt)//因为每一层的输出顺序都不一样,所以每一层都要单独存,然后单独输出,用vector{    int i,j;    int mmax=-1;    node *s;    queue<node*> q;    rt->step=0;    q.push(rt);    while(!q.empty())    {        s=q.front();        q.pop();        vt[s->step].push_back(s->num);        mmax=max(mmax,s->step);        if(s->lc!=NULL)        {            s->lc->step=s->step+1;            q.push(s->lc);        }        if(s->rc!=NULL)        {            s->rc->step=s->step+1;            q.push(s->rc);        }    }    printf("%d",vt[0][0]);    for(i=1; i<=mmax; i++)    {        if(i&1)        {            for(j=0; j<(int)vt[i].size(); j++)                printf(" %d",vt[i][j]);        }        else        {            for(j=vt[i].size()-1; j>=0; j--)                printf(" %d",vt[i][j]);        }    }    printf("\n");    return ;}int main(){    int i;    node *T;    scanf("%d",&n);    for(i=1; i<=n; i++)        scanf("%d",&a[i]);    for(i=1; i<=n; i++)        scanf("%d",&b[i]);    build(n,1,n,T);    bfs(T);    return 0;}




0 0
原创粉丝点击