PAT A1020 Tree Traversals 根据先序和中序求层序

//不会增加监视 
//空格打不出来,全局变量不能放到局部函数中进行比较、赋值等操作!因为传递的是值,而不是位置。可是书上直接那样写的啊,郁闷 
//不是queue<node>* q;是指针队列,队列中存放的就是指针,所以是queue<node*> q;第一个是定义一个指向存放node类型的队列的指针 
//注意判断是大于等于,重建时递归条件 
#include<cstdio>
#include<queue>
#include<algorithm>
//#define LOCAL
 
using namespace std;

const int maxn=32;
int postOrder[maxn];
int inOrder[maxn];
int n; 

struct node{
	int data;
	node* lchild,*rchild;
};

//queue<node> layerOrder;好像并不需要在这里定义 

//如果不知道怎么写重建二叉树的函数,记得把先序或者后序遍历的左右边界在注释中列出来
//后序序列区间[postL,postR],中序遍历区间[inL,inR] 
node* create(int postL,int postR,int inL,int inR){//在创建二叉树的时候才创建各个结点,不然只是在数组中的互相没有父子关系的离散点 
	//总是不知道递归边界
	if(postL>postR){//postL==postR的时候,序列中还有一个元素 .嗯我用一个元素试了一下。。 
		return NULL;//后序序列长度小于等于0时,直接返回 
	}
	node* root=new node();
	root->data=postOrder[postR];
	//找到在中序遍历中的     
	int i;
	for(i=inL;i<=inR;i++){//这里一开始写成了<而不是<=inR 
		if(inOrder[i]==postOrder[postR]) break;
	}
	//需要计算一下数量把!下面这个数量确定需要算一下就好了!
	int leftnum=i-inL;//是的吧,除了i的个数
	int rightnum=inR-i;//也是正好啊,那就不对了吧,哦好像是对的,inl~inR个数是inR-inL+1 
	root->lchild=create(postL,postL+leftnum-1,inL,i-1);
	root->rchild=create(postL+leftnum,postR-1,i+1,inR);//这两行是自己推断着写的,居然对了!好开心,以为大部分可能会出个把错呢,所以ixangx自己! 
	return root; 
} 

/*queue layerOrder(){
	
} */


//层序遍历就是BFS.一定记得每次新的root进行push入队列后取出的是队首元素 
void BFS(node *root,int n){//需要确定起点的。这个root只做每次BFS的起点作用 
	queue<node*> q;//定义一个指针的队列。一定一定注意队列里存放的是地址
	q.push(root);//注意了,先把root放进队列,但是访问的却不是root,而是当前队列的队首元素,所以一定要取队首元素的!并且访问完要弹出队首元素,不是弹出root 
	int num=0;//已经输出的结点个数 
	while(!q.empty()){
		node* now=q.front();//注意先保存队首元素(是指针哦!),然后访问,然后把对首元素相关的push不是把root相关的push! 
		q.pop(); 
		printf("%d",now->data);
		num++;
		if(num<n) printf(" "); 
		if(now->lchild!=NULL) q.push(now->lchild); //居然一开始写成了BFS(now->lchild!BFS(now->rchild) 
		if(now->rchild!=NULL) q.push(now->rchild); 
	}
} 

int main(){
	#ifdef LOCAL
	freopen("A1020.in","r",stdin);
	freopen("A1020.out","w",stdout);
	#endif
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&postOrder[i]);
	}
	for(int i=0;i<n;i++){
		scanf("%d",&inOrder[i]);
	}
	node* root=create(0,n-1,0,n-1);
	//printf("%d\n",n); 
	BFS(root,n);//哎,这个地方这样传参行不行呢
	return 0; 
} 


你可能感兴趣的:(C++,算法,pat)