二叉树遍历的经典入门题
本题涉及二叉树根据后序和中序还原二叉树,然后使用层序遍历二叉树
注意点:
子树左右边界确定的时候仔细点,可以自己写几个数据验证一下正确性。
建树的时候要注意叶子节点的处理,千万别忽略了。
层序遍历的时候,需要传入根结点的指针。
#include<cstdio>
#include<queue>
using namespace std;
const int maxn=33;
int n;
int post[maxn];
int in[maxn];
struct node{
int data;
node* lchild;
node* rchild;
};
node* create(int postL,int postR,int inL,int inR){
if(postL > postR) return NULL;
node* root = new node;
root->data = post[postR];
int k=inL;
while(k<=inR && in[k] != post[postR]){
k++;
}
int numLeft = k-inL;
root->lchild=create(postL,postL+numLeft-1,inL,k-1);
root->rchild=create(postL+numLeft,postR-1,k+1,inR);
return root;
}
void LayerOrder(node* root){ //层序遍历
queue<node*> q;
q.push(root);
int flag=0;
while(!q.empty()){
node* tmp = q.front();
q.pop();
if(flag==0){
printf("%d",tmp->data);
flag=1;
}else{
printf(" %d",tmp->data);
}
if(tmp->lchild!=NULL) q.push(tmp->lchild);
if(tmp->rchild!=NULL) q.push(tmp->rchild);
}
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&post[i]);
}
for(int i=0;i<n;i++){
scanf("%d",&in[i]);
}
node* root = create(0,n-1,0,n-1);
LayerOrder(root);
return 0;
}