基本的な質問パラメータを明確に入力します
#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.シーケンス番号がある場合は、通常のシーケンスです。現時点では、プログラムとは関係ありません。インデックスを使用して、シーケンスとシーケンスを関連付けます。
2.以前に記録されたエラーを修正します。ここのエントリはテーブルの範囲内ではありませんが、ルートが最初にある順序です。
3.これは、ルート1ではなく左サブツリーのルートである必要があります。最初に左サブツリーの範囲を決定し、次にシーケンスに従って決定します。ポストオーダーの左サブツリーのルート(注)
4. // iは中間シーケンスの位置であり、ポストシーケンスではありません(注)
// inr inlを使用しないことを決定したため、エラーinll、inrrを見つけるのは簡単ではありません;
//ルートノード全体が常にポストシーケンスで提供されるルートノード。また、ここにサブツリーのルートノードがあることに注意してください。
英語
番号
問題
さまざまなシーケンスで、他のシーケンスのパラメータを入力する内容は、2番目の前後で明確かつ熟練して習得する必要があり、1番目と2番目のレイヤーは固定されていません。これは比較的特別な期間です。