参考大神做法:链接
#include <iostream>
#include <vector>
using namespace std;
std::vector<int> post,in;// 两个容器分别放后序序列和中序序列
std::vector<int> level[30];// 容器数组,数组的每一个元素都是一个容器,容器内记录了树一层的元素
void dfs(int postf,int postr, int inf,int inr, int currentLevel){
if(postf>postr) return;// 退出递归的条件
// 子树的根节点是属于currentLevel这一层的
// 子树的根节点就是该棵子树后序遍历的最后一个元素
level[currentLevel].push_back(post[postr]);
// 在该子树的中序序列中找到子树根结点的位置
// 同时也就确定了该棵子树的左右子树中结点的数量
// 根据根据这个数量从post和in中截取出左右子树的序列范围
int index;
for(index=inf;index<=inr;index++){
if(in[index]==post[postr]) break;
}
// 对左右子树进行相同的操作,注意层数+1
dfs(postf,postf+index-inf-1, inf,index-1, currentLevel+1);
dfs(postf+index-inf,postr-1, index+1,inr, currentLevel+1);
}
int main(int argc, char** argv) {
int n;// 元素数量
cin>>n;
// 限定后序序列和中序序列容器的长度
post.resize(n);
in.resize(n);
for(int i=0;i<n;i++){
cin>>post[i];
}
for(int i=0;i<n;i++){
cin>>in[i];
}
// 借助后序和中序序列完成对一棵树的深度遍历,顺便记录这棵树的层次结构
// 前两个参数是子树后序遍历在容器中的下标范围;
// 中间两个参数是子树中序遍历在容器中的下标范围;
// 最后一个参数这颗子树的根节点所在的层数(层数从0开始)
dfs(0,n-1, 0,n-1, 0);
// 按照层次输出level即可
cout<<level[0][0];
for(int i=1;i<30;i++){
for(int j=0;j<level[i].size();j++){
cout<<" "<<level[i][j];
}
}
return 0;
}