这道题相当于给出先序和中序求后序遍历的题差不多,只需要记录一下depth就行了。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <stack>
using namespace std;
const int maxn = 60;
char pre[maxn],in[maxn];
int n,mx=1;
void dfs(int root, int start, int end, int depth){
if(start > end) return;
mx = max(mx,depth);
int i = start;//每次都从start开始
while(in[i] != pre[root]) i ++;//遍历,找到根结点。
dfs(root + 1, start, i - 1,depth + 1);//每次遍历左子树和右子树时高度要+1
dfs(root + (i - start + 1), i + 1, end, depth + 1);
}
int main(){
cin >> n;
getchar();
for(int i = 0; i < n;i++) scanf("%c",&pre[i]);
getchar();
for(int i = 0; i < n; i ++) scanf("%c",&in[i]);
dfs(0,0,n-1,1);
cout << mx;
return 0;
}