利用先序遍历序列和中序遍历序列来建立两棵二叉树,并判断是否相等
创建的方法是将该二叉树的先序的序列和中序的序列分别存储到Pre数组和Mid数组中,它们的存储顺序如下:
采用递归的方法,用先序,中序,后序遍历的方法对两棵树每个数据判断是否相等
#include
#include
typedef char TElemType;
存储先序和中序序列字符数组
char Pre[100],Mid[100];
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//创建二叉树
//Pre_star.....代表数组下标
BiTree BiTree_Creat(BiTree T,int Pre_start,int Pre_end,int Mid_start,int Mid_end)
{
int i;
int LtreeLen,RtreeLen;
T=(BiTree)malloc(sizeof(BiTNode));
if(!T)
{
printf("malloc_error!");
}
//先序很容易找到根结点,中序的话需要遍历
T->data=Pre[Pre_start];//取先序序列中第一个字符作为根结点的数据域值
//查找中序序列中的根结点
for(i=Mid_start;Mid[i]!=T->data;)
{
++i;根结点在序列i位置
}
计算左右子树结点个数
LtreeLen=i-Mid_start;
RtreeLen=Mid_end-i;
if(LtreeLen)不断深入左子树
{
T->lchild=BiTree_Creat(T,Pre_start+1,Pre_start+LtreeLen,Mid_start,Mid_start+LtreeLen-1);
}
else
{
T->lchild=NULL;
}
if(RtreeLen)不断深入右子树
{
T->rchild=BiTree_Creat(T,Pre_end-RtreeLen+1,Pre_end,Mid_end-RtreeLen+1,Mid_end);
}
else
{
T->rchild=NULL;
}
return T;
}
先序判断两树是否相等
int Pre_Cmp(BiTree T1,BiTree T2)
{
//如果两树都为空,返回1
if(!T1&&!T2)
{
return 1;
}
if(T1&&T1)
{
if(T1->data==T2->data)
{
if(Pre_Cmp(T1->lchild,T2->lchild))//递归左子树每个数据是否相等
{
if(Pre_Cmp(T1->rchild,T2->rchild))//递归右子树每个数据是否相等
{
return 1;//两树完全相等,返回1
}
}
}
}
return 0;//两树不相等,返回0
}
中序判断两树是否相等
int In_Cmp(BiTree T1,BiTree T2)
{
if(!T1&&!T2)
{
return 1;
}
if(T1&&T2)
{
if(In_Cmp(T1->lchild,T2->lchild))
{
if(T1->data==T2->data)
{
if(In_Cmp(T1->rchild,T2->rchild))
{
return 1;
}
}
}
}
return 0;
}
后序判断两树是否相等
int Last_Cmp(BiTree T1,BiTree T2)
{
if(!T1&&!T2)
{
return 1;
}
if(T1&&T2)
{
if(Last_Cmp(T1->lchild,T2->lchild))
{
if(T1->rchild,T2->rchild)
{
if(T1->data==T2->data)
{
return 1;
}
}
}
}
return 0;
}
int main()
{
BiTree T1,T2;
int Is_Bitree;
int ch;
strcpy(Pre,"abcde");//先序顺序
strcpy(Mid,"bdcae");//中序顺序
T1=BiTree_Creat(T1,0,4,0,4);
T2=BiTree_Creat(T2,0,4,0,4);
while(1)
{
printf("***///T1T2相等或都为空则输出1,否则反之///***\n\n");
printf("1_Pre_Cmp\n");
printf("2_In_Cmp\n");
printf("3_Last_Cmp\n");
printf("4_exit\n");
scanf("%d",&ch);
switch(ch)
{
case 1:Is_Bitree=Pre_Cmp(T1,T2);printf("%d",Is_Bitree);break;
case 2:Is_Bitree=In_Cmp(T1,T2);printf("%d",Is_Bitree);break;
case 3:Is_Bitree=Last_Cmp(T1,T2);printf("%d",Is_Bitree);break;
case 4:return;
default:printf("input error!");
}
printf("\n");
}
return 0;
}