需求:
利用先序遍历序列和中序遍历序列来建立两棵二叉树,并判断是否相等
需要先将创建二叉树
创建的方法是将该二叉树的先序的序列和中序的序列分别存储到Pre数组和Mid数组中,它们的存储顺序如下:
判断两棵树是否相等
采用递归的方法,用先序,中序,后序遍历的方法对两棵树每个数据判断是否相等
- 两棵树都为空,返回1
- 两棵树不相等,返回0
- 两棵树相等,返回1
代码解析及代码如下:
#include <stdio.h>
#include <string.h>
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;
}
本文介绍了一种通过先序和中序遍历序列构建二叉树的方法,并提供了使用递归算法判断两棵二叉树是否相等的实现。通过三个不同的遍历顺序进行比较,确保了树结构的一致性。
986

被折叠的 条评论
为什么被折叠?



