题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805349394006016
给一个二叉树的中序和和后序遍历,然后按每层输出,并且要第一层从左到右,第二层从右到左。。反正感觉有点诡异。
做的时候想了半天都没有什么可以偷懒的算法,只好老老实实地建树然后再广搜遍历。
第一次写根据中序和后序建树,写的时候参数改了半天。代码写的也有点惨

#include<iostream>
#include<vector>

using namespace std;
struct node{
    int num;
    node *left,*right;
};
const int MAXN = 100;
int In[MAXN],Po[MAXN];
node *R;
void build(node*root,int b,int e,int ri)
{
    root->left = NULL;
    root->right = NULL;
    int lnum = 0,rnum = 0;
    if(b==e)return;
    for(int i = b ; i < e; i++)
    {
        if(In[i]==Po[ri])
        {
            break;
        }
        lnum++;
    }
    rnum = e-b-lnum-1 ;
    if(b<b+lnum)
    {
        root->left = new node;
        build(root->left,b,b+lnum,ri-rnum-1);
    }
    if(b+lnum+1<e)
    {
       root->right = new node;
        build(root->right,b+lnum+1,e,ri-1);
    }

}
void p(node* root)
{
    if(root!=NULL)
    {
         cout<<root->num<<" ";
         p(root->left);
        p(root->right);
    }
}
vector<int> ans[MAXN];
int maxc;
void dfs(node* root,int cur)
{
    if(root==NULL)return;
    maxc = max(maxc,cur);
    ans[cur].push_back(root->num);
    dfs(root->left,cur+1);
    dfs(root->right,cur+1);
}
int main()
{
    int N;
    cin >> N;
    for(int i = 0 ;i < N ; i++)
    {
        cin >> In[i];
    }
    for(int i = 0 ;i < N ; i++)
    {
        cin >> Po[i];
    }
    R = new node;
    build(R,0,N,N-1);
   // p(R);
   dfs(R,0);
   for(int i = 0 ; i <= maxc ; i++)
   {
       if(i%2!=0)
       {
           for(int j = 0 ; j < ans[i].size(); j++)
           {
               cout<<ans[i][j];
               if(!(i==maxc && j==ans[i].size()-1 ))
               {
                   cout<<" ";
               }

           }
       }
       else{
            for(int j = ans[i].size()-1 ; j >= 0 ; j--)
           {
               cout<<ans[i][j];
               if(!(i==maxc && j==0))
               {
                   cout<<" ";
               }
           }
       }
   }
    return 0;
}