判断两棵二叉树是否相等。
遇到了bug,求大神帮忙!!!
C语言源代码:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
typedef struct BiTNode{
char data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
BiTree CreateBiTree(BiTree *T){//先序建立二叉树
char ch;
scanf("%c",&ch);
if(ch=='#')//如果在控制台输入‘#’,表示该处结点为NULL
*T=NULL;
else{
*T=(BiTNode *)malloc(sizeof(BiTNode));
if(!(*T)) exit(0);
(*T)->data=ch;
(*T)->lchild=CreateBiTree(&((*T)->lchild));
(*T)->rchild=CreateBiTree(&((*T)->rchild));
}
return *T;
}
int CmpTree(BiTree T1, BiTree T2){//判断两棵二叉树是否相等
if(T1==NULL&&T2==NULL)//T1,T2均为NULL
return 1;
else if(T1==NULL||T2==NULL)//T1,T2其中一个为NULL
return 0;
if(T1->data!=T2->data)//T1,T2均不为NULL,但是T1,T2的值不相等
return 0;
//T1,T2均不为NULL,并且T1,T2的值相等
int left, right;
left=CmpTree(T1->lchild, T2->lchild);
right=CmpTree(T1->rchild, T2->rchild);
return left&&right;
}
void main(){
BiTree T1;
printf("请先序创建第一棵二叉树:\n");
T1=CreateBiTree(&T1);
printf("第一棵二叉树创建成功!\n");
BiTree T2;
printf("请先序创建第二棵二叉树:\n");
T2=CreateBiTree(&T2);//bug:当建立第二棵二叉树时,最后需要多输入一个‘#’;
//当建立两棵相同的二叉树时,两棵二叉树的遍历结果相同,但是第二棵二叉树会比第一棵二叉树多出一个结点
printf("第二棵二叉树创建成功!\n");
if(CmpTree(T1, T2))//由于bug的存在,二叉树比较函数不能正确判断出两棵相等的二叉树
printf("您创建的两棵二叉树相等!");
else
printf("您创建的两棵二叉树不相等!");
}
在调试程序时,出现了以下bug:
当在控制台创建第二棵二叉树时,最后需要多输入一个‘#’,比如想要创建两棵相同的二叉树(先序创建),如图:
A
B C
D E
创建第一棵二叉树,控制台输入:ABD##E##C##
创建第二棵二叉树,控制台输入:ABD##E##C###
经过测试,按以上过程建立两棵相同的二叉树时,控制台输出的两棵二叉树的遍历结果相同,但是第二棵二叉树会比第一棵二叉树多出一个结点,因此二叉树比较函数不能正确判断两棵相等的二叉树
遍历(先序)函数和计算结点个数函数如下:
void PreOrderTraverse(BiTree T){//先序遍历二叉树
if(T)
{
printf("%2c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
int NodeCount(BiTree T){//统计二叉树中结点的个数
if(T==NULL)
return 0;
else
return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}
基本排除是二叉树比较函数的设计错误,请问bug的产生原因是什么?需要怎么修改程序,才能得出正确的结果呢?