#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));
}
读入二叉树的中序和后序遍历,输出此二叉树的前序遍历和叶子节点个数
最新推荐文章于 2023-05-04 16:58:33 发布