知道前序和中序,那么后序的第一个数一定是前序左子树(若有左子树),或是右子树的最后一个数。前序:根左右,中序:左根右,后序:左右根。
#include <bits/stdc++.h>
using namespace std;
vector<int> pre, in;
int main() {
int n;
scanf ("%d", &n);
pre.resize(n);
in.resize(n);
for (int i = 0; i < n; i++) scanf("%d", &pre[i]);
for (int i = 0; i < n; i++) scanf("%d", &in[i]);
int k = 0;
while (in[k] != pre[0]) k++;
if (k == 0 && n != 1) {
int x = 1;
while (in[x] != pre[1]) x++;
printf ("%d", pre[x]);
}
else if (k == 0 && n == 1) printf ("%d", pre[0]);
else printf ("%d", pre[k]);
}
试了试几个大佬的代码,后面测试点都是两三百ms。
偷鸡只要21ms