新知识
根据后序中序求前序
用遍历
学习了别人的代码
#include <cstdio>
using namespace std;
int post[] = {3, 4, 2, 6, 5, 1};
int in[] = {3, 2, 4, 1, 6, 5};
void pre(int root, int start, int end) {
if(start > end) return ;
int i = start;
while(i < end && in[i] != post[root]) i++;
printf("%d ", post[root]);
pre(root - 1 - end + i, start, i - 1); //左子树
pre(root - 1, i + 1, end); //右子树
}
int main() {
pre(5, 0, 5);
return 0;
}
start 是树开始的地方,end是树结束的地方, root是当前根,拿来输出
理解,,
这道题没有还原 原来的树 ,直接存到数组,然后输出
注意数组要开的够大,不然最后一个测试点会过不去
所以用vector比较好?
补充: vector resize是开了可以用的内存,reserve是开了但是还不能用,预存的。
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
int n;
int post[1000], in[1000], level[100000];
void pre(int root, int start, int end, int inde){
if(start > end) return ;
int i = start;
while(i < end && in[i] != post[root] ) i++;
level[inde] = post[root];
pre(root-end+i-1,start,i-1,2*inde+1);
pre(root-1,i+1,end,2*inde+2);
}
int main(){
scanf("%d", &n);
memset(level,-1,sizeof(level));
int key = 0;
for(int i=0; i<n; i++) scanf("%d",&post[i]);
for(int i=0; i<n; i++) scanf("%d",&in[i]);
pre(n-1,0,n-1,0);
for(int i=0; i<sizeof(level); i++){
if(level[i] != -1){
if(i==0) printf("%d",level[i]);
else printf(" %d",level[i]);
key++;
}
if(key==n) break;
}
return 0;
}