資料結構(C語言實現):判斷兩棵二叉樹是否相等,bug求解
阿新 • • 發佈:2018-12-17
判斷兩棵二叉樹是否相等。
遇到了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的產生原因是什麼?需要怎麼修改程式,才能得出正確的結果呢?