说明:
本次实验利用中序和先序序列,采用递归方式来构建二叉树 。
经过几天的失败和思考,我认为递归构建二叉树的过程中最重要的是递归单元,最麻烦的是递归参数的选择和传递。
简单将算法过程用如下流程图来表示:(本帖所用算法及图片均为原创内容,转贴注明出处)
算法: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 }
感想:对于这个算法,最困扰我的就是递归的参数传递问题,因为是编程之前接触的少,递归也算是第一次自己写,所以走了很多弯路。
我的收获就是,编写程序之前一定要先设计好算法的流程,最好能够将算法需要用到的参数,变量,函数名都预先写好,这样更有利于算法转化为代码实现。
理解递归,多参考一下别人的经验吧,带图的最好了,不带图的都是耍流氓。
欢迎大家和我交流,相互学习。