码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-08-17 23:32:40      阅读:253      评论:0      收藏:0      [点我收藏+]

标签:

说明:

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

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

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

技术分享

技术分享

技术分享

 

 算法: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 }

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

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

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

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

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

标签:

原文地址:http://www.cnblogs.com/like4519/p/4737948.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!