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

来源:互联网 发布:app软件著作权说明书 编辑:程序博客网 时间:2024/05/21 22:22
//不会增加监视 //空格打不出来,全局变量不能放到局部函数中进行比较、赋值等操作!因为传递的是值,而不是位置。可是书上直接那样写的啊,郁闷 //不是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 LOCALfreopen("A1020.in","r",stdin);freopen("A1020.out","w",stdout);#endifint 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; } 


0 0