根据前序中序遍历序列求后序遍历序列&&根据中序后序遍历序列求前序遍历序列

前序中序还原树

基本思想:前序序列访问的第一个节点是根节点,中序序列在根节点的两侧分别是左右子树中序遍历的序列

BitNode *CreateBiTree_Post(char *prestr,char *instr,int length)//前序中序还原
{
	if(length == 0)
	{
		return NULL;
	}
	int i = 0;
	char c = prestr[0];//找到根节点
	while(instr[i] != c && i<length)
	{
		i++;
	}//此时i是根节点在中序序列中的下标
	int leftlength = i;//左子树序列长度
	int rightlength = length - i - 1;//右子树序列长度
	BitNode*T = (BitNode*)malloc(sizeof(BitNode));
	
	T->data = c;
	T->lchild  =NULL;
	T->rchild = NULL;

	T->lchild = CreateBiTree_Post(&prestr[1],&instr[0],leftlength);//递归求左子树的根
	/*prestr[1]是左子树前序遍历第一个节点,instr[0]是左子树中序遍历的第一个节点*/
	T->rchild = CreateBiTree_Post(&prestr[i+1],&instr[i+1],rightlength);//递归求右子树的根
	/*prestr[i+1]是右子树前序遍历第一个节点,instr[i+1]是右子树中序遍历的第一个节点*/
	return T;
}

中序后序还原树
基本思想:中序序列在根节点的两侧分别是左右子树中序遍历的序列,后序序列访问的最后一个节点是根节点。

BitNode *CreateBiTree_Pre(char *instr,char *afterstr,int length)//中序后序还原
{
	if(length == 0)
	{
		return NULL;
	}
	char c = afterstr[length - 1];//后序遍历的最后是根节点
	int i = 0;
	while((instr[i] != c) && i < length)
	{
		i++;
	}//此时i是根节点在中序序列中的下标
	int leftlength = i;//左子树序列长度
	int rightlength = length - i - 1;//右子树序列长度
	BitNode *T;
	T = (BitNode*)malloc(sizeof(BitNode));

	T->data = c;
	T->lchild = NULL;
	T->rchild = NULL;

	T->lchild = CreateBiTree_Pre(&instr[0],&afterstr[0],leftlength);//递归求左子树的根
	/*instr[0]是左子树中序遍历第一个节点,afterstr[0]是左子树后序遍历的第一个节点*/
	T->rchild = CreateBiTree_Pre(&instr[i+1],&afterstr[i],rightlength);//递归求右子树的根
	/*instr[i+1]是左子树中序遍历第一个节点,afterstr[i]是右子树后序遍历的第一个节点*/
	return T;
}

下面贴完整代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct BitNode
{
	char data;
	struct BitNode *lchild;
	struct BitNode *rchild;
} BitNode;

BitNode *CreateBiTree_Pre(char *instr,char *afterstr,int length);//中序后序转前序
BitNode *CreateBiTree_Post(char *prestr,char *instr,int length);//前序中序转后序
void PreOrderTraverse(BitNode*T);
void PostOrderTraverse(BitNode*T);
int main(void)
{
	while(1)
	{
		printf("请选择:1、前序中序求后序2、中序后序求前序3、退出\n");
		int a;
		scanf("%d",&a);
		if(a == 1)
		{
			char prestr[100];
			char instr[100];
			printf("请输入前序输出序列\n");
			scanf("%s",prestr);
			printf("请输入中序输出序列\n");
			scanf("%s",instr);
			int length = strlen(prestr);
			BitNode* T;
			T = CreateBiTree_Post(prestr,instr,length);
			printf("后序序列为\n");
			PostOrderTraverse(T);
		}
		else if(a == 2)
		{
			char instr[100];
			char afterstr[100];
			printf("请输入中序输出序列\n");
			scanf("%s",instr);
			printf("请输入后序输出序列\n");
			scanf("%s",afterstr);
			int length = strlen(instr);
			BitNode* T;
			T = CreateBiTree_Pre(instr,afterstr,length);
			printf("前序序列为\n");
			PreOrderTraverse(T);
		}
		else if(a == 3)
		{
			return 0;
		}
		else
		{
			printf("请重新输入\n");
		}
	}

	return 0;
}
BitNode *CreateBiTree_Pre(char *instr,char *afterstr,int length)//中序后序还原
{
	if(length == 0)
	{
		return NULL;
	}
	char c = afterstr[length - 1];//后序遍历的最后是根节点
	int i = 0;
	while((instr[i] != c) && i < length)
	{
		i++;
	}
	int leftlength = i;
	int rightlength = length - i - 1;
	BitNode *T;
	T = (BitNode*)malloc(sizeof(BitNode));

	T->data = c;
	T->lchild = NULL;
	T->rchild = NULL;

	T->lchild = CreateBiTree_Pre(&instr[0],&afterstr[0],leftlength);
	T->rchild = CreateBiTree_Pre(&instr[i+1],&afterstr[i],rightlength);
	return T;
}
BitNode *CreateBiTree_Post(char *prestr,char *instr,int length)//前序中序还原
{
	if(length == 0)
	{
		return NULL;
	}
	int i = 0;
	char c = prestr[0];//找到根
	while(instr[i] != c && i<length)
	{
		i++;
	}
	int leftlength = i;
	int rightlength = length - i - 1;
	BitNode*T = (BitNode*)malloc(sizeof(BitNode));
	T->data = c;

	T->lchild  =NULL;
	T->rchild = NULL;

	T->lchild = CreateBiTree_Post(&prestr[1],&instr[0],leftlength);
	T->rchild = CreateBiTree_Post(&prestr[i+1],&instr[i+1],rightlength);
	return T;
}
void PreOrderTraverse(BitNode*T)
{
	if(T)
	{
		printf("%c",T->data);
		PreOrderTraverse(T->lchild);
		PreOrderTraverse(T->rchild);
	}
}
void PostOrderTraverse(BitNode*T)
{
	if(T)
	{
		PostOrderTraverse(T->lchild);
		PostOrderTraverse(T->rchild);
		printf("%c",T->data);
	}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值