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