根据先序和中序序列构建二叉树

说明:

本次实验利用中序和先序序列,采用递归方式来构建二叉树 。

经过几天的失败和思考,我认为递归构建二叉树的过程中最重要的是递归单元,最麻烦的是递归参数的选择和传递。

简单将算法过程用如下流程图来表示:(本帖所用算法及图片均为原创内容,转贴注明出处)

 

 算法:1.根据先序序列,建立根结点T

          2.寻找中序序列的根结点位置,并据此位置计算左子树和右子树的区间

          3.判断l_start和r_end是否相等,相等则表示只有一个根结点,设置其左右孩子结点为空并结束这一层;若不相等则继续下面步骤:

          4.根据2中的左孩子区间,若区间不空,递归调用函数自身;若区间为空则令其左孩子为空;

          5.根据2中的右孩子区间,若区间不空,递归调用函数自身;若区间为空则令其右孩子为空;

代码实现如下:

 1 //6.根据先序和中序序列构建二叉树
 2 typedef int ElemType;
 3 typedef int Status;
 4 
 5 typedef struct BTNode{
 6     ElemType    data; 
 7     struct BTNode *lchild,*rchild; 
 8 }BTree;
 9 int Pre[7]={1,2,3,4,5,6,7},In[7]={3,2,4,1,6,5,7};
10 int preRoot=0;
11 Status CreByPreIn(BTree *root,int l_start,int r_end){
12     int nowpos=0;
13     root->data=*(Pre+preRoot);
14     while(*(In+nowpos)!=root->data)nowpos++;
15     preRoot++;
16     if(l_start == r_end){
17         root->lchild=NULL;
18         root->rchild=NULL;
19         return OK;
20     }
21     if(l_start<=nowpos){
22         BTree *lt=(BTree*)malloc(sizeof(BTree));
23         root->lchild=lt;
24         CreByPreIn(root->lchild,l_start,nowpos-1);
25     }
26     else root->lchild=NULL;
27     if(nowpos<=r_end){
28         BTree *rt=(BTree*)malloc(sizeof(BTree));
29         root->rchild=rt;
30         CreByPreIn(root->rchild,nowpos+1,r_end);
31     }
32     else root->rchild=NULL;
33 }

感想:对于这个算法,最困扰我的就是递归的参数传递问题,因为是编程之前接触的少,递归也算是第一次自己写,所以走了很多弯路。

我的收获就是,编写程序之前一定要先设计好算法的流程,最好能够将算法需要用到的参数,变量,函数名都预先写好,这样更有利于算法转化为代码实现。

理解递归,多参考一下别人的经验吧,带图的最好了,不带图的都是耍流氓。

欢迎大家和我交流,相互学习。

转载于:https://www.cnblogs.com/geolike/p/4737948.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值