二叉树遍历的经典入门题
本题涉及二叉树根据后序和中序还原二叉树,然后使用层序遍历二叉树
注意点:
子树左右边界确定的时候仔细点,可以自己写几个数据验证一下正确性。
建树的时候要注意叶子节点的处理,千万别忽略了。
层序遍历的时候,需要传入根结点的指针。

#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;
}