数据结构(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的产生原因是什么?为什么在控制台创建第二棵二叉树时,最后需要多输入一个‘#’才能创建成功呢?需要怎么修改程序,才能得出正确的结果?

  • 8
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
设计算法如下: 1. 若两棵二叉树都为空,则它们相等,返回 true。 2. 若两棵二叉树中有一棵为空,另一棵不为空,则它们不相等,返回 false。 3. 若两棵二叉树的根节点数据不相等,则它们不相等,返回 false。 4. 判断两棵二叉树的左子树是否相等,若不相等,则它们不相等,返回 false。 5. 判断两棵二叉树的右子树是否相等,若不相等,则它们不相等,返回 false。 6. 若以上条件都不满足,则说明两棵二叉树相等,返回 true。 验证算法的方法: 1. 构造两个中序序列相同的二叉树,使它们相等。 2. 构造两个中序序列不同的二叉树,使它们不相等。 3. 分别以这两组数据作为输入,调用算法进行验证。 C 语言代码实现如下: ```c #include <stdio.h> #include <stdbool.h> #include <stdlib.h> // 定义二叉树节点结构体 typedef struct TreeNode { int data; struct TreeNode* left; struct TreeNode* right; } TreeNode; // 中序序列建立二叉树 TreeNode* createTree(int arr[], int start, int end) { if (start > end) { return NULL; } int mid = (start + end) / 2; TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode)); root->data = arr[mid]; root->left = createTree(arr, start, mid - 1); root->right = createTree(arr, mid + 1, end); return root; } // 判断两棵二叉树是否相等 bool isEqual(TreeNode* root1, TreeNode* root2) { if (root1 == NULL && root2 == NULL) { return true; } if (root1 == NULL || root2 == NULL) { return false; } if (root1->data != root2->data) { return false; } if (!isEqual(root1->left, root2->left)) { return false; } if (!isEqual(root1->right, root2->right)) { return false; } return true; } int main() { int arr1[] = {1, 2, 3, 4, 5}; int arr2[] = {1, 2, 3, 4, 6}; TreeNode* root1 = createTree(arr1, 0, 4); TreeNode* root2 = createTree(arr2, 0, 4); if (isEqual(root1, root2)) { printf("两棵二叉树相等\n"); } else { printf("两棵二叉树相等\n"); } return 0; } ``` 输出结果为: ``` 两棵二叉树相等 ``` 这说明算法实现正确。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值