给出一个二叉树的前序和中序遍历,求其后序遍历。
search(la, ra, x):在字符串 a 的 [la,ra] 下标区间中查找 x,返回其下标。
work(la, ra, lb, ra):在前序遍历的 [la,ra] 和中序遍历的 [lb,rb] 区间创建二叉树。
dfs():输出后序遍历结果。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 5;
string a, b;
struct node {
char c;
int l, r;
} t[N];
int cnt;
int search(int la, int ra, char x) {
for(int i = la; i <= ra; i++)
if(a[i] == x) return i;
return -1;
}
int work(int la, int ra, int lb, int rb) {
if(la > ra || lb > rb) return 0;
int m = search(lb, rb, a[la]), s1 = (m - 1) - lb, s2 = rb - (m + 1);
t[cnt++] = {a[la], work(la + 1, la + s1, lb, m - 1), work(ra - s2 + 1, ra, m + 1, rb)};
return cnt;
}
void dfs(int x) {
if(t[x].l) dfs(t[x].l);
if(t[x].r) dfs(t[x].r);
cout<<t[x].c;
}
signed main() {
cin>>a>>b;
work(0, a.length() - 1, 0, a.length() - 1);
dfs(1);
return 0;
}