#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct bitnode{ char data; //结点数据 struct node *Lchild; //左孩子 struct node *Rchild; //右孩子}tree; //结点int Lchild_len(char insequence[10],char root_data) //得到左孩子的长度{ int len=strlen(insequence); int i=0; int sum=0; //记录左孩子长度 while(insequence[i]!=root_data) { i++; sum++; } return sum;}int Rchild_len(char insequence[10],char root_data) //得到右孩子的长度{ int i=0; int sum=0; //记录右孩子长度 while(insequence[i]!='\0'&&insequence[i++]!=root_data); while(insequence[i]!='\0') { sum++; i++; } return sum;}tree* create_tree(char presequence[10],char insequence[10]) //创建二叉树{ tree* temp=(tree*)malloc(sizeof(tree)); //创建结点 int L_len,R_len; //储存左右孩子长度 char L_presequence[10],L_insequece[10]; //创建左孩子时传入的左孩子的前序串和中序串 char R_presequence[10],R_insequece[10]; //创建右孩子时传入的右孩子的前序串和中序串 L_presequence[0]=L_insequece[0]=R_presequence[0]=R_insequece[0]='\0'; if(strlen(presequence)!=0&&strlen(insequence)!=0) //传入的序列串非空 { temp->data=presequence[0]; //根结点数据赋值 L_len=Lchild_len(insequence,presequence[0]); //获得孩子的长度 R_len=Rchild_len(insequence,presequence[0]); strncpy(L_presequence,presequence+1,L_len); //得到要递归创建孩子时要传入的前序遍历串和中序遍历串 *(L_presequence+L_len)='\0'; //字符串末尾加上'\0' strncpy(R_presequence,presequence+L_len+1,R_len); *(R_presequence+R_len)='\0'; strncpy(L_insequece,insequence,L_len); *(L_insequece+L_len)='\0'; strncpy(R_insequece,insequence+L_len+1,R_len); *(R_insequece+R_len)='\0'; temp->Lchild=create_tree(L_presequence,L_insequece); //递归创建左子树 temp->Rchild=create_tree(R_presequence,R_insequece); //递归创建右子树 return temp; //返回结点地址 } else //若根结点无孩子,则返回空指针 { return NULL; }}int main(){ char presequence[10]; //存先序序列 char insequence[10]; //存中序序列 tree *root; scanf("%s",presequence); scanf("%s",insequence); root=create_tree(presequence,insequence); levelorder(root); printf("\n");}
kevinZee