读入二叉树的中序和后序遍历,输出此二叉树的前序遍历和叶子节点个数

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "malloc.h"

typedef char DataType;

/*读入二叉树的中序和后序遍历,输出此二叉树的前序遍历和叶子节点个数
测试数据
DGBAECHF
GDBEHFCA
前序遍历:ABDGCF
*/
/*定义二叉树结构体*/
typedef struct tree
{
	DataType d;
	struct tree *lchild,*rchild;
}Tree,*PTree;

/*in表示中序字符串 post 表示后序字符串 ins ine分别表示中序字符串的起始长度 posts poste 分别表示后序字符串的起始长度*/
void makeTree(PTree *p,char *in,int ins,int ine,char *post,int posts,int poste)
{
	int preIndex=0;//定义中序字符串中 中间数的位置
	if(poste<posts||ine<ins) *p=NULL;
	else
	{
		*p=(PTree)malloc(sizeof(Tree));
		(*p)->d=post[poste];
		//(*p)->lchild=NULL;
		//(*p)->rchild=NULL;
		for(preIndex=ins;preIndex<=ine;preIndex++)
		{
			if(post[poste]==in[preIndex])
			{
				makeTree(&(*p)->lchild,in,ins,preIndex-1,post,posts,preIndex-ins-1);
				makeTree(&(*p)->rchild,in,preIndex+1,ine,post,preIndex-ins,poste-1);
				break;
			}
		}
		/*该函数每次从0开始
		while(9)
		{
			if(in[preIndex]==post[poste])break;
			preIndex++;
		}*/

	}
}
/*前序遍历二叉树*/
void preOrder(PTree p)
{
	if(p)
	{
		printf("%c",p->d);
		preOrder(p->lchild);
		preOrder(p->rchild);
	}
}
/*求叶子节点数*/
int leafNum(PTree p)
{
	if(p==NULL)
		return 0;
	else 
		if(p->lchild==NULL&&p->rchild==NULL)
			return 1;
		else 
			return leafNum(p->lchild)+leafNum(p->rchild);
}
void main()
{
	char in[100],post[100];
	int il,pl;
	PTree p;
	printf("输入中序\n");
	gets(in);
	printf("输入后序\n");
	gets(post);
	il=strlen(in);
	pl=strlen(in);
	makeTree(&p,in,0,strlen(in)-1,post,0,strlen(post)-1);
	printf("前序遍历:");
	preOrder(p);
	printf("\n叶子节点数为%d\n",leafNum(p));

}

你可能感兴趣的:(读入二叉树的中序和后序遍历,输出此二叉树的前序遍历和叶子节点个数)