题目描述
知识点
树的遍历(中序,后序,层序)
实现
码前思考
- 关于构树就是简单的模板;
- 至于如何实现这种特殊的层序遍历,可以使用队列加栈的方式,同时记录当前层数。
代码实现
#include "bits/stdc++.h"
using namespace std;
const int maxn = 50;
struct node{
int level;//多余的,删掉
int val;
node* l;
node* r;
node(int v):val(v),level(-1),l(NULL),r(NULL){}
};
int n;
int in[maxn];
int post[maxn];
//表示返回当前的根结点
node* create(int inL,int inR,int postL,int postR){
if(postL > postR){
//说明没有可以寻找的区间了
return NULL;
}else{
//得到该子树的根结点
int val = post[postR];
node* root = new node(val);
// printf("结点值为:%d\n",val);
//确定左子树的大小
int numLeft = 0;
for(int i=inL;i<=inR;i++){
if(in[i] != val){
numLeft++;
}else{
break;
}
}
//得到之后开始分别构建左子树和右子树
root->l = create(inL,inL+numLeft-1,postL,postL+numLeft-1);
root->r = create(inL+numLeft+1,inR,postL+numLeft,postR-1);
return root;
}
}
int main(){
scanf("%d",&n);
//读入in
for(int i=0;i<n;i++){
scanf("%d",&in[i]);
}
for(int i=0;i<n;i++){
scanf("%d",&post[i]);
}
//进行重构
node* root = NULL;
root = create(0,n-1,0,n-1);
//下面开始进行层序遍历,使用队列和栈
queue<node*> q;
stack<node*> st;
//存储结果的数组
int res[maxn];
int cnt = 0;
int level = 1;
q.push(root);
while(!q.empty()){//只要队列不为空
while(!q.empty()){
node* cur = q.front();
res[cnt++] = cur->val;
// printf("值为:%d\n",cur->val);
q.pop();
st.push(cur);
}
while(!st.empty()){
//首先对弹出来的进行放入数组
node* cur = st.top();
//如果当前Level是奇数
if(level % 2 == 1){
//先放左节点再放右结点
if(cur->l!=NULL){
q.push(cur->l);
}
if(cur->r!=NULL){
q.push(cur->r);
}
}else{
//先放右结点再放左节点
if(cur->r!=NULL){
q.push(cur->r);
}
if(cur->l!=NULL){
q.push(cur->l);
}
}
st.pop();
}
level++;
}
for(int i=0;i<n;i++){
printf("%d",res[i]);
if(i!=n-1){
printf(" ");
}
}
return 0;
}
码后思考
- 认真分析,题目不难。