数据结构(C语言实现):判断两棵二叉树是否相等,bug求解

判断两棵二叉树是否相等。

遇到了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的产生原因是什么?需要怎么修改程序,才能得出正确的结果呢?

猜你喜欢

转载自blog.csdn.net/Shishishi888/article/details/83313112