Sample Input:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
Sample Output:
4 1 6 3 5 7 2
先轉換成前序,然後在每一個節點帶一個index,最後排序一下就是層序的結果了
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<vector>
using namespace std;
struct node{
int index,value;
};
bool cmp(node a,node b){
return a.index < b.index;
}
vector<int> post,in;
vector<node> ans;
void pre(int root,int start,int end,int index){
if(start > end)
return;
int i = start;
while(i < end && post[root] != in[i])i++;//後序的最後一個節點就是前序的第一根
ans.push_back({index,post[root]});
pre(root - 1 - end + i,start,i - 1, 2 * index + 1);
pre(root - 1,i + 1,end,2 * index + 2);
}
int main(){
int n;
cin >> n;
post.resize(n);
in.resize(n);
for(int i = 0;i < n;i++)cin >> post[i];
for(int i = 0;i < n;i++)cin >> in[i];
pre(n - 1,0,n - 1,0);
sort(ans.begin(),ans.end(),cmp);
cout << ans[0].value;
for(int i = 1;i < ans.size();i++){
cout << " " << ans[i].value;
}
return 0;
}
後序中序轉前序
void pre(int root,int start,int end){
if(start > end)
return;
int i = start;
while(i < end && post[root] != in[i])i++;
printf("%d ",post[root]);
pre(root - 1 - end + i,start,i - 1);
pre(root - 1,i + 1,end);
}