PAT 1020 Tree Traversals

题目的目的是很简单明了的,就是给定一棵二叉树的后序序列和中序序列,要求我们给出层次遍历的序列。

本题的关键点在于二叉树的重建和层次遍历。

本题是利用后序序列和中序序列来进行二叉树的重建,参考函数如下:

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;
		}
	}
}
总结:

最近做题目挺适合提高自己的编程能力的,所以开始写写博文记录下自己的成长,一方面自己可以回头看看编写过的代码回顾算法的等,另一方面也可以跟大家一起分享下,由于小编编程能力尚属中下,望众大牛勿喷。有优化的方法或建议恳请大家留言,小编很希望能持续提升自己的编程水平。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值