PAT

B1127 ZigZagging on a Tree (树的建立

2020-01-29  本文已影响0人  Tsukinousag

B1127 ZigZagging on a Tree (30分)

//简单模板题,思维量不大,手速要快!!!

两序建树

  • 判断是否能继续进行
    if(left>right)
    return;
  • 新建根结点,找寻根节点的值和位置
  • 递归左子树和右子树
  • 返回根节点

层序记录当前结点的深度,vt存放当前层的顺序数


奇数2k-1层的放在vt[2k-1]逆向输出,偶数2k层的放在vt[2k]正向输出


#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string.h>
#include <cmath>
#include <math.h>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <stack>
#define lowbit(i)((i)&(-i))
using namespace std;
typedef long long ll;
const int MAX=50;
const int INF=0x3f3f3f3f;
const int MOD=1000000007;
const int SQR=633;
int in[MAX],post[MAX];
int k=0;
struct node
{
    node* lchild;
    node* rchild;
    int data;
    int height;
};
vector<int>vt[MAX];
void bfs(node* root)
{
    queue<node*>q;
    root->height=1;
    q.push(root);
    while(!q.empty())
    {
        node* top=q.front();
        q.pop();
        k=max(k,top->height);
        vt[top->height].push_back(top->data);
        if(top->lchild!=NULL)
        {
            top->lchild->height=top->height+1;
            q.push(top->lchild);
        }
        if(top->rchild!=NULL)
        {
            top->rchild->height=top->height+1;
            q.push(top->rchild);
        }
    }
}
node* create(int inl,int inr,int postl,int postr)
{
    if(postl>postr)
        return NULL;
    node* root=new node;
    root->data=post[postr];
    int i;
    for(i=inl;i<=inr;i++)
    {
        if(in[i]==post[postr])
            break;
    }
    int numleft=i-inl;
    root->lchild=create(inl,i-1,postl,postl+numleft-1);
    root->rchild=create(i+1,inr,postl+numleft,postr-1);
    return root;
}
int main()
{
   int n;
   scanf("%d",&n);
   for(int i=1;i<=n;i++)
   {
       scanf("%d",&in[i]);
   }
   for(int i=1;i<=n;i++)
   {
       scanf("%d",&post[i]);
   }
    node* a=create(1,n,1,n);
    bfs(a);
    printf("%d",vt[1][0]);
    for(int i=2;i<=k;i++)
    {
        if(i%2!=0)
        {
            for(int j=vt[i].size()-1;j>=0;j--)
                printf(" %d",vt[i][j]);
        }
        else
        {
            for(int j=0;j<vt[i].size();j++)
                printf(" %d",vt[i][j]);
        }
    }
    return 0;
}
上一篇下一篇

猜你喜欢

热点阅读