pat-1020

基本的な質問パラメータを明確に入力します 

#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番目のレイヤーは固定されていません。これは比較的特別な期間です。

おすすめ

転載: blog.csdn.net/m0_45359314/article/details/112714391