根据先序遍历和中序遍历推后序遍历C语言

事实上,一个中序遍历的算法中入栈的过程中,如果你把每个入栈的结点保存起来,你会发现这些结点就是先序遍历的结果,同样,出栈就是中序遍历,如下图
在这里插入图片描述

  • 核心算法
    在这里插入图片描述
    先序遍历的第一个结点一定是根结点,也是后序遍历的最后一个结点,找到它在中序中的位置 i ,那么 i 的左边就是左子树,右边是右子树,递归的求解左右两边
  • 代码
#include <stdio.h>
#include <stdlib.h>
#define SIZE 6
//
int pre[6]={1,2,3,4,5,6};//先序遍历数组 
int in[6]={3,2,4,1,6,5};//中序遍历 数组 
int post[6]={0};//后序遍历数组 
void CreatePost(int first,int mid,int last,int n)
{
	printf("------%d-------\n",first);
	if(n==0){
		return;	
	}
	if(n==1)
	{
		post[last]=pre[first];
		return;
	}
	int root=pre[first];
	post[last+n-1]=root;
	int i;
	for(i=0;i<6;i++)
	{
		if(root==in[i+mid])
			break;
	}
	int L=i;
	int R=n-L-1;
	CreatePost(first+1,mid,last,L);
	CreatePost(first+L+1,mid+L+1,last+L,R);
	
}
int main(int argc, char** argv) {
	CreatePost(0,0,0,6);
	
	for(int i=0;i<6;i++)
		printf("%d ",post[i]);
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值