题目的目的是很简单明了的,就是给定一棵二叉树的后序序列和中序序列,要求我们给出层次遍历的序列。
本题的关键点在于二叉树的重建和层次遍历。
本题是利用后序序列和中序序列来进行二叉树的重建,参考函数如下:
Node * rebuild(int *post,int *in,int len )
{
if(len == 0)
return NULL; //判断是否为空树
int i=len-1;
while(post[len-1] != in[i])i--;//查找根节点的位置
Node *p1;
p1=new Node;
p1->data=post[len-1];
p1->left=rebuild(post,in,i);//左子树的重建
p1->right=rebuild(post+i,in+i+1,len-i-1); //右子树的重建
return p1;
}
关于层次遍历,小编借鉴了下课件,运用的是循环数组来实现:
void levelorder(Node *p)
{
Node *q,*circle[MaxSize]; //建立循环数组
int front=-1,rear=0,flag=0;
circle[rear]=p;
while(front!=rear)
{
front=(front+1)%MaxSize;
q=circle[front];
if(flag==0)//用来判断是否为根节点
{
flag=1;
printf("%d",q->data);
}
else
printf(" %d",q->data);
if(q->left!=NULL )
{
rear=(rear+1)%MaxSize;
circle[rear]=q->left;
}
if(q->right!=NULL)
{
rear=(rear+1)%MaxSize;
circle[rear]=q->right;
}
}
}
总结:
最近做题目挺适合提高自己的编程能力的,所以开始写写博文记录下自己的成长,一方面自己可以回头看看编写过的代码回顾算法的等,另一方面也可以跟大家一起分享下,由于小编编程能力尚属中下,望众大牛勿喷。有优化的方法或建议恳请大家留言,小编很希望能持续提升自己的编程水平。