1. 程式人生 > >資料結構(C語言實現):判斷兩棵二叉樹是否相等,bug求解

資料結構(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的產生原因是什麼?需要怎麼修改程式,才能得出正確的結果呢?