基础题参数填写要明确
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> in,post;
struct node{
int data;
int index;
};
vector<node> level;
int n;
void dfs(int root,int inl,int inr ,int index)
{
//end
if(inl>inr) return;
int i=inl;
while(post[root]!=in[i])i++;
//这里应该是左子树的根而不是想当然的root-1要先确定左子树的范围再根据序列确定 (注意)
//i是在中序中的位置不是后序 (注意)
//决定以后不用inr inl 不容易发现错误 inll,inrr;
//不是整个的根节点始终是后序中提供的根节点 ,也注意这里是找的是子树中的根节点
dfs(root-1-(inr-i),inl,i-1,2*index+1);
//入得到底是谁的root是谁的
level.push_back({post[root],index});
dfs(root-1,i+1,inr,2*index+2);
}
bool cmp(node a,node b)
{
return a.index<b.index;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{ int temp;
cin>>temp;
post.push_back(temp);
}
for(int i=0;i<n;i++)
{
int temp1;
cin>>temp1;
in.push_back(temp1);
}
dfs(n-1,0,n-1,0);
sort(level.begin(),level.end(),cmp);
printf("%d",level[0].data);
for(int i=1;i<level.size();i++)
printf(" %d",level[i].data);
return 0;
}
总结
1.如果有层序编号,只是普通的层序,此时就和程序没啥关系就只用index即可 与层序有关加上层序
2.纠正之前记录的错误这里入得不是表范围的而是root一开始在哪个序列就入那个序列的
3.这里应该是左子树的根而不是想当然的root-1要先确定左子树的范围再根据序列确定 ,左子树在后序中的根(注意)
4. //i是在中序中的位置不是后序 (注意)
//决定以后不用inr inl 不容易发现错误 inll,inrr;
//不是整个的根节点始终是后序中提供的根节点 ,也注意这里是找的是子树中的根节点
英语
无
问题
各种 序列求另一序列中 参数究竟填什么要明确熟练掌握 前中 求后 后中求前求层 以及 前后 序列固不固定这个比较特殊时期要二刷