二叉树建立问题,帮忙看看错误在哪里?
#include <stdio.h>#include <stdlib.h>
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
char prelist[3]={'b','a','c'};//前序序列
char inlist[3]={'a','b','c'};//中序序列
char postlist[3]={'a','c','b'};//后序序列
void Visit(TElemType e)//对数据元素进行操作的Visit函数
{
printf("%c",e);
}
///////二叉树的遍历
void PreOrderTraverse(BiTree T)//先序遍历二叉树的递归算法
{
if(T)
{
Visit(T->data);
PreOrderTraverse(T->lchild);//递归调用
PreOrderTraverse(T->rchild);//递归调用
}
}
////////////////////////////////////////////
int nodenum=3;//序列中的节点数
BiTNode *tree1;//根指针
int CreatBTrecurison(int starta,int enda,int startb,int endb,BiTNode **root)//已知前序和中序序列构建二叉树
{
int t1,t2;
if(starta>enda)//序列区间中的元素已经被访问完
{
*root=NULL;
return 1;
}
else
{
*root=(BiTree)malloc(sizeof(BiTNode));
(*root)->data=prelist[starta];//先序序列的第一个元素为根结点
t1=startb;
t2=-1;
while(t1<=endb)//在中序序列中找子树的根节点
if(inlist[t1]==prelist[starta])//找到子树的根节点
{
t2=t1;
t1=endb+1;
}
else//继续后找
t1++;
if(t2==-1)//找不到子树的根
return 0;
if(CreatBTrecurison(starta+1,enda+t2-startb,startb,t2-1,&((*root)->lchild))==0)//递归调用建立左子树
return 0;
if(CreatBTrecurison(starta+t2-startb+1,enda,t2+1,endb,&((*root)->rchild))==0)//递归调用建立右子树
return 0;
return 1;
}
}
void CreateBinaryTree()
{
tree1=(BiTree)malloc(sizeof(BiTNode));
CreatBTrecurison(0,nodenum-1,0,nodenum-1,&tree1);
};
//*******************************************************************************************************
BiTNode *tree2;
int CreatBTrecurison2(int starta,int enda,int startb,int endb,BiTNode **root)//已知中序和后序序列构建二叉树
{
int t1,t2;
if(starta>enda)
{
*root=NULL;
return 1;
}
else
{
*root=(BiTree)malloc(sizeof(BiTNode));
(*root)->data=postlist[enda];//后序序列的最后一个元素为根结点
t1=startb;
t2=-1;
while(t1<=endb)
if(inlist[t1]==postlist[enda])//在中序序列中找子树的根节点
{
t2=t1;
t1=endb+1;
}
else
t1++;
if(t2==-1)
return 0;
if(CreatBTrecurison2(starta,starta+t2-startb,startb,t2-1,&((*root)->lchild))==0)
return 0;
if(CreatBTrecurison2(starta+t2-startb+1,enda-1,t2+1,endb,&((*root)->rchild))==0)
return 0;
return 1;
}
}
void CreateBinaryTree2()
{
tree2=(BiTree)malloc(sizeof(BiTNode));
CreatBTrecurison2(0,nodenum-1,0,nodenum-1,&tree2);
};
void main()
{
CreateBinaryTree();
printf("输出构建的二叉树的中序遍历结果:\n");
PreOrderTraverse(tree1);//输出已知前序和中序序列构建的二叉树中序遍历结果
printf("\n");
CreateBinaryTree2();
printf("输出构建的二叉树的中序遍历结果:\n");
PreOrderTraverse(tree2);//输出已知中序和后序序列构建的二叉树中序遍历结果
printf("\n");
}