题目意思言简意赅
输入:输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
eg:input:
7 2 3 1 5 7 6 4 1 2 3 4 5 6 7output:4132657注意这个树非常丑陋: 4 / \ 1 6 \ / \ 3 5 7 / 2
首先是先序排列:根据后序的最后一个可以找到根的位置,然后再根据根在中序里面搜索,分为左右子树
详情可以参考这篇题解https://www.luogu.org/blog/user21653/solution-p1030 这个输入输出有点区别,但原理是一样的
1 #include <bits/stdc++.h>
2 using namespace std;
3 const int inf=1<<30;
4 typedef long long ll;
5 typedef pair<int,int> P;
6 const double pi=acos(-1);
7 const int mod=1e8+7;
8 const int maxn=140;
9 const int maxm=6300;
10 int a[maxn],b[maxn];//a存后序遍历,b存中序遍历
11 void rule(int i,int j,int l,int r){
12 if(j-i>=0){
13 int dd=j,idx;
14 cout<<a[dd];
15 for(int p=l;p<=r;p++){
16 if(b[p]==a[dd]){
17 idx=p;break;
18 }
19 }
20 rule(i,i+(idx-1-l),l,idx-1);
21 rule(i+(idx-l),j-1,idx+1,r);
22 }
23 }
24 int main(){
25 int n;scanf("%d",&n);
26 for(int i=1;i<=n;i++)scanf("%d",&a[i]);
27 for(int i=1;i<=n;i++)scanf("%d",&b[i]);
28 rule(1,n,1,n);
29 return 0;
30 }
接着便是层序遍历:
输入一样,这次输出是
4 1 6 3 5 7 2方法也基本相同,就是多了个index,初始都为-1,最后按顺序输出不为-1的
1 #include <bits/stdc++.h>
2 using namespace std;
3 const int inf=1<<30;
4 typedef long long ll;
5 typedef pair<int,int> P;
6 const double pi=acos(-1);
7 const int mod=1e8+7;
8 const int maxn=140;
9 const int maxm=6300;
10 int a[maxn],b[maxn];//a存后序遍历,b存中序遍历
11 vector<int> level(100000,-1);
12 void rule(int i,int j,int l,int r,int index){
13 if(j-i>=0){
14 int dd=j,idx;
15 level[index]=a[dd];
16 for(int p=l;p<=r;p++){
17 if(b[p]==a[dd]){
18 idx=p;break;
19 }
20 }
21 rule(i,i+(idx-1-l),l,idx-1,index*2+1);
22 rule(i+(idx-l),j-1,idx+1,r,index*2+2);
23 }
24 }
25 int main(){
26 int n;scanf("%d",&n);
27 for(int i=1;i<=n;i++)scanf("%d",&a[i]);
28 for(int i=1;i<=n;i++)scanf("%d",&b[i]);
29 rule(1,n,1,n,0);
30 int cnt=0;
31 for(int i=0;i<level.size();i++){
32 if(level[i]!=-1&&cnt!=n-1){
33 cnt++;printf("%d ",level[i]);
34 }else if(level[i]!=-1){
35 printf("%d\n",level[i]);
36 break;
37 }
38 }
39 return 0;
40 }
来源:https://www.cnblogs.com/qingjiuling/p/10491872.html