中序+后序建树问题,第一次做不知道对不对,这个思路比较好理解
能够AC
#include <bits/stdc++.h>
using namespace std;
struct Node
{
int id;
int left;
int right;
};
vector<int> postorder(30);
vector<int> inorder(30);
vector<Node> node(30);
vector<int> location(1000,-1);
int maketree(int l,int r)
{
if(l==r)
return l;
if(l>r)
return -1;
int j=-1;
int maxj=-1;
for(int i=l;i<=r;i++)
{
if(location[inorder[i]]>maxj)
{
maxj=location[inorder[i]];
j=i;
}
}
node[j].left=maketree(l,j-1);
node[j].right=maketree(j+1,r);
return j;
}
int main()
{
int n;
cin>>n;
postorder.resize(n);
inorder.resize(n);
node.resize(n);
location.resize(n);
for(int i=0;i<n;i++)
{
cin>>inorder[i];
node[i].id=inorder[i];
node[i].left=-1;
node[i].right=-1;
}
for(int i=0;i<n;i++)
{
cin>>postorder[i];
location[postorder[i]]=i;
}
int root=maketree(0,n-1);
queue<int> que;
que.push(root);
int c=1;
int k=1;
while(!que.empty())
{
vector<int> temp;
int len=que.size();
for(int i=0;i<len;i++)
{
int t=que.front();
temp.push_back(node[t].id);
if(node[t].left!=-1)
que.push(node[t].left);
if(node[t].right!=-1)
que.push(node[t].right);
que.pop();
}
if(c%2==1)
{
for(int i=temp.size()-1;i>=0;i--)
{
cout<<temp[i];
if(k!=n)
cout<<" ";
k++;
}
}
else
{
for(int i=0;i<temp.size();i++)
{
cout<<temp[i];
if(k!=n)
cout<<" ";
k++;
}
}
c++;
}
}