中序后序先序

/*
要想由这三种遍历二叉树的序列重建唯一的二叉树则至少得有两种遍历序列,且这两种中一定要有中序序列,也就是先序+中序-->二叉树  或者  后序+中序-->二叉树,而先序+中序得不到唯一的二叉树。
*/
#include <stdio.h>
#include <malloc.h>
#include <string.h>
//二叉链表
typedef struct node{
	char data;//节点数据元素
	struct node *lchild;//指向左孩子
	struct node *rchild;//指向右孩子
}BiNode,*BTree;
//利用后序和中序建立二叉树
void GetPreOrder(char *last,char *mid,BTree &T,int len)
{
	if(len==0)
	{
		T = NULL;
		return;
	}
	//取出后序序列中的最后一个节点
	char ch=last[len-1];
	int index=0;
	//在中序序列中进行查找根节点,并用index记录其在序列中的索引
	while(mid[index]!=ch)
	{
		index++;
	}
	//给根节点分配空间
	T=(BTree)malloc(sizeof(BiNode));
	T->data=mid[index];
	//建立左子树
	GetPreOrder(last,mid,T->lchild,index);
	//建立右子树
	GetPreOrder(last+index,mid+index+1,T->rchild,len-index-1);
}
//先序中序 输出后序
void GetPostOrder(char *prim,char *mid,BTree &T,int len)
{
	if(len==0)
	{
		T=NULL;
		return;
	}
	//提出先序序列中的第一个节点
	char ch=prim[0];
	int index=0;
	//在中序序列中查找当前根节点,并用index记录其在序列中的位置
	while(mid[index]!=ch)
	{
		index++;
	}
	//给根节点分配空间
	T=(BTree)malloc(sizeof(BiNode));
	T->data=mid[index];
	//建立左子树
	GetPostOrder(prim+1,mid,T->lchild,index);
	//建立右子树
	GetPostOrder(prim+index+1,mid+index+1,T->rchild,len-index-1);
}
//先序输出二叉树
void PreOrder(BTree T)
{
	if(T!=NULL)
	{
		printf("%c",T->data);
		PreOrder(T->lchild);
		PreOrder(T->rchild);
	}
}
//后序输出二叉树
void PostOrder(BTree T)
{
	if(T!=NULL)
	{
		PostOrder(T->lchild);
		PostOrder(T->rchild);
		printf("%c",T->data);
	}
}
int main()
{
	char first[26],mid[26],last[26];
	while(scanf("%s%s",last,mid)!=EOF)
	{
		BTree T=NULL;
		GetPreOrder(last,mid,T,strlen(last));
		PreOrder(T);
// 		GetPostOrder(last,mid,T,strlen(last));
// 		PostOrder(T);
		printf("\n");
	}
	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

paidream

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值