死亡的面试题 PAT 1020 Tree Traversals (25分)

 根据后序和中序遍历得到层序遍历

重点还是建树的过程

首先对于后序遍历的规则是  左右根,所以对于每一个子树的后序遍历数组,最后一个数总是这棵子树的根

然后在中序遍历的数组中,先找到这个根,由于中序遍历的规则是  左根右  所以找到的这个根,这个根的左边就是他的左子树,右边就是右子树

然后依次递归下去处理好边界就行了

#include
using namespace std;
#define ll long long
#define pb push_back
const int maxn = 1e5 + 10;
vector v[maxn];
int a[maxn], b[maxn], tot = 1;
int dfs(int l, int r, int fa){
    if(l > r) return 0;
    int x = a[fa], st = 1;
    while(st <= r && b[st] != x)st++;
    int L = dfs(l, st - 1, fa - r + st - 1);//递归左子树
    int R = dfs(st + 1, r, fa - 1);//递归右子树
    if(L) v[x].pb(a[fa - r + st - 1]);
    if(R) v[x].pb(a[fa - 1]);
    return 1;
}
void bfs(int fa){
    queue q;
    q.push(fa);
    while(!q.empty()){
        int x = q.front();q.pop();
        for(int i =0 ; i < v[x].size(); i++){
            printf(" %d", v[x][i]);
            q.push(v[x][i]);
        }
    }
}
int main(){
    int n, st;
    scanf("%d", &n);
    for(int i = 1; i <= n; i++)scanf("%d", &a[i]);
    for(int i = 1; i <= n; i++)scanf("%d", &b[i]);
    dfs(1, n, n);
    printf("%d", a[n]);
    bfs(a[n]);
    printf("\n");
    return 0;
}

 

你可能感兴趣的:(PAT甲级,PAT甲级)