题目链接: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;
}