//不会增加监视
//空格打不出来,全局变量不能放到局部函数中进行比较、赋值等操作!因为传递的是值,而不是位置。可是书上直接那样写的啊,郁闷
//不是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;
} PAT A1020 Tree Traversals 根据先序和中序求层序
最新推荐文章于 2022-10-16 16:49:59 发布
本文介绍了一种使用后序遍历和中序遍历来重建二叉树的方法,并实现了一个层序遍历(BFS)来展示重建后的二叉树结构。文中详细解释了如何通过递归创建二叉树节点以及如何正确地使用队列来进行层序遍历。
441

被折叠的 条评论
为什么被折叠?



