给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。 输入格式:
输入第一行给出一个正整数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");
} 
京公网安备 11010502036488号