给出二叉树的先序和中序,求二叉树的后续遍历

解析:
首先分析:给出先序遍历的二叉树的结果,我们知道先序是:根 左 右;中序是:左 根 右;
那么我们很容易就知道在先序遍历中可以确定二叉树的根所在的位置,其次再在中序遍历中找出根的左边和右边,这样不断的递归就会将原来的二叉树构建
出来,之后再进行后续遍历:左 右 根;
伪代码如下:
/*
思想:根据二叉树的先序序列和中序序列恢复二叉树的递归思想是:先根据先序序列的第一个结点建立根结点,然后在中序序列中找到
该结点,从而划分出根节点的左、右子树的中序序列。接下来再在先序序列中确定左、右子树的先序序列,并有左子树的先序序列与
中序序列继续递归建立左子树,由右子树的先序序列与中序序列继续递归建立右子树。
    为了能够将恢复的二叉树传回给主调函数,在函数Per_In_order中使用了二级指针**p.
在下面的算法中,二叉树的先序遍历序列和中序遍历序列分别存放在一维数组pred和ind中。算法如下: 
*/
 
<span style="font-size:18px;"> void Pre_In_order(char pred[],char ind[],int i,int j,int k,int h,BSTree **p){
  	//i、j和k、h分别为当前子树先序序列和中序序列的下、上界
	  int m;
	  *p=(BSTree*)malloc(sizeof(BSTree));//在主调函数空间申请一个结点 
	  (*p)->data=pred[i]; //根据pred数组生成二叉树的根结点 
	    m=k;  //m指向ind数组所存储的中序序列中第一个结点 
	  while(ind[m]!=pred[i]) //找到根结点在中序序列所在的位置 
	    m++;
	  if(m==k)  //根结点是中序序列的第一个结点时则无左子树 
	    (*p)->lchild=NULL;
	  else
	    Pre_In_order(pred,ind,i+1,i+m-k,k,m-1,&(*p)->lchild);
	    //根据根结点所划分出中序序列的两个部分继续构造左右子树 
	  if(m==h) //根结点是中序序列的最后一个根结点时则无右子树 
	    (*p)->rchild=NULL;
	  else
	    Pre_In_order(pred,ind,i+m-k+1,j,m+1,h,&(*p)->rchild);
	    //根据根结点所划分出中序序列的两个部分继续构造左右两颗子树。 
  } </span>


//2.接下来后续遍历二叉树的递归算法:
<span style="font-size:18px;">void Postorder(BSTree *p){
	if(p!=NULL){
		Postorder(P->lchild);    //后序遍历左子树 
		Postorder(P->rchild);    //后序遍历右子树
		printf("%3c",p->data);   //访问根结点 
	}
} </span>


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值