给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。 输入格式:

输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
输出格式:

在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

树的先序遍历:DLR
树的后序遍历:LRD
树的中序遍历:LDR
树的层序遍历:从上到下 从左到右依次遍历
DFS进行搜索 找到根之后划分左子树和右子树

#include<bits/stdc++.h>
using namespace std;

int H[35],Z[35];
int ans[35][35]={0};

void dfs(int a,int b,int l,int r,int cnt){
    ans[cnt][0]++;//ans[cnt][0]记录的是cnt这一层有多少个数 
    ans[cnt][ans[cnt][0]]=H[b];//记录节点 
    for(int i=l;i<=r;i++){
        if(Z[i]==H[b]){
            if(i-1>=l)dfs(a,a+i-l-1,l,i-1,cnt+1);//区间划分注意! 
            if(i+1<=r)dfs(a+i-l,b-1,i+1,r,cnt+1);
        }
    }
}

int main(){
    int N;
    cin>>N;
    for(int i=1;i<=N;i++)scanf("%d",&H[i]);
    for(int j=1;j<=N;j++)scanf("%d",&Z[j]);
    dfs(1,N,1,N,1);
    printf("%d",ans[1][1]);//ans[1][1]是整棵树的根 
    for(int i=2;ans[i][0];i++){
        for(int j=1;j<=ans[i][0];j++){
            printf(" %d",ans[i][j]);
        }
    }
    printf("\n");
}