采用的方式和L2-006树的遍历的方式类似,都是使用不建树,只是用递归的方式来得到要输出的数据。
但是一开始的时候,自己没有仔细想二叉树遍历的过程就直接做了。具体的错误做法是,先把当前树的根存到数组中,递归遍历右子树和左子树,将得到的数组当作层序遍历的结果输出。犯的错误是,没有想清楚函数递归调用的过程,遍历左右树的函数不会同时执行。上面这种做法按照 根 -- 右 -- 左 的方式依次遍历整个树,而非期待的层序遍历方式。
正确的方式是再递归函数参数中 增加层数变量,将树递归遍历过程中的根存储在不同层的数组中,最终得到正确的层序遍历结果进行输出。
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int mid[N],suf[N];
int tr[N][N],len;
int n;
void gettree(int l1,int r1,int l2,int r2,int depth){
//cout << l1 << ' ' << r1 << ' ' << l2 << ' ' << r2 << endl;
if(l1>r1) {
len = max(len,depth -1);
return ;
}
int x = suf[l2];
int top = tr[depth][0];
tr[depth][++top] = x;
tr[depth][0] = top;
int p;
for(int i=l1;i<=r1;i++){
if(mid[i]==x){
p = i;
break;
}
}
int llen = p - 1 - l1 + 1;
int rlen = r1 - (p + 1) + 1;
gettree(p+1,r1,r2-rlen+1,r2,depth+1);
gettree(l1,p-1,l2+1,l2+1+llen-1,depth+1);
}
int main(){
cin >> n ;
for(int i=1;i<=n;i++){
cin >> mid[i] ;
}
for(int i=1;i<=n;i++){
cin >> suf[i] ;
}
gettree(1,n,1,n,1);
// cout << "len:" << len << endl;
for(int i=1;i<len;i++){
int l = tr[i][0];
// cout << i << ' ' << l << endl;
for(int j=1;j<=l;j++){
cout << tr[i][j] <<' ' ;
}
}
int l =tr[len][0];
for(int i=1;i<l;i++){
cout << tr[len][i] << ' ' ;
}
cout << tr[len][l] << endl;
return 0;
}