编程实现根据二叉树的先序遍历序列和中序遍历序列来建立两棵二叉树,并判断这两棵二叉树是否相等。

编程实现根据二叉树的先序遍历序列和中序遍历序列来建立两棵二叉树,并判断这两棵二叉树是否相等。
⑴ 实验要求
① 假设二叉树的结点值是字符,请分别根据输入的两棵二叉树的先序遍历序列和中序遍历序列来建立二叉链表表示的两棵二叉树。
② 分别利用先序、中序和后序遍历方法来实现判断两棵二叉树是否相等的操作。
③ 主程序中要求设计一个菜单,允许用户通过菜单来多次选择执行利用哪一种遍历方法来判断两棵二叉树是否相等。
⑵ 核心算法提示
1)二叉树的建立
编程实现根据二叉树的先序遍历序列和中序遍历序列来建立两棵二叉树,并判断这两棵二叉树是否相等。_第1张图片
假设二叉树的先序遍历序列和中序遍历序列已经存储在数组Pre和Mid中,其序列分列具有如图5-3所示的特征
根据此特征,建立二叉树的基本步骤可归纳为:
① 建立根结点,取先序先序遍历序列中的第一个字符作为根结点的数据域值;
② 在中序遍历序列中查找确定这个根结点在中序遍历序列中的位置,由此得到在根结点左边的序列即为此根结点左子树的中序遍历序列,而右边的序列即为此根结点右子树的中序遍历序列。
③ 根据左、右子树中序遍历序列中的字符个数再在先序遍历序列中确定左、右子树的先序遍历序列。
④ 根据(2)、(3)确定的左、右子树的先序和中序遍历序列采用递归调用的方法建立根结点的左、右子树。
2)判断两棵二叉树是否相等
假设T1和T2是两棵二叉树,如果两棵二叉树都是空树;或者两棵树的根结点的值相等,并且根结点的左、右子树分别也相等,则称二叉树T1与T2是相等的。所以,也可以利用先序、中序和后序遍历方法,采用递归函数来判断两棵树是否相等。假设两棵树相等,函数返回1,否则返回0。下面以用先序遍历方法为例,说明其基本操作步骤为:
① 如果两棵二叉树都为空,则函数返回1;
② 如果两棵二叉树都不为空,则先判断两棵树的根结点值是否相等,如果相等,则再采用递归调用的方法判断它的左、右子树是否相等,如果都相等则函数返回1;
③ 其它情况都返回0。
⑶ 核心算法描述
char Pre[100],Mid[100]; /存储先序和中序序列的字符数组,定义为全局变量/
Bitree creat_sub(Bitree T,int Pre_start,int Pre_end,int Mid_start,int Mid_end)
/已知二叉树的先序序列和中序序列,建立此二叉树/
{ int i,ltreelen,rtreelen;
T=(Bitree)malloc(sizeof(Bitnode)); /建立根结点/
T->data=Pre[Pre_start]; /取先序序列中的第一个字符作为根结点的数据域值/
for(i=Mid_start;Mid[i]!=T->data;i++); /在中序序列中查找根结点/
ltreelen=i-Mid_start; /计算左子树中结点个数/
rtreelen=Mid_end-i; /计算右子树中结点个数/
if(ltreelen)
T->lchild=creat_sub(T,Pre_start+1,Pre_start+ltreelen,Mid_start,Mid_start+ltreelen-1) ;
else
T->lchild=NULL;
if(rtreelen)
T->rchild=creat_sub(T,Pre_end-rtreelen+1,Pre_end,Mid_end-rtreelen+1,Mid_end);
else
T->rchild=NULL;
return T;
}
int precmp(Bitree T1,Bitree T2)
/用先序遍历方法判断两棵二叉树是否相等/
{ if (!T1&&!T2) return 1;
if (T1&&T2)
if (T1->dataT2->data)
if (precmp(T1->lchild,T2->lchild))
if(precmp(T1->rchild,T2->rchild))
return 1;
return 0;
}
int midcmp(Bitree T1,Bitree T2)
/用中序遍历方法判断两棵二叉树是否相等/
{ if (!T1&&!T2) return 1;
if (T1&&T2)
if (precmp(T1->lchild,T2->lchild))
if (T1->data
T2->data)
if(precmp(T1->rchild,T2->rchild))
return 1;
return 0;
}
int backcmp(Bitree T1,Bitree T2)
/用后序遍历方法判断两棵二叉树是否相等/
{ if (!T1&&!T2) return 1;
if (T1&&T2)
if (precmp(T1->lchild,T2->lchild))
if(precmp(T1->rchild,T2->rchild))
if (T1->data==T2->data)
return 1;
return 0; }

你可能感兴趣的:(编程实现根据二叉树的先序遍历序列和中序遍历序列来建立两棵二叉树,并判断这两棵二叉树是否相等。)