二叉樹——判斷兩棵二叉樹是否相等(先序和中序遍歷序列建立二叉樹)
阿新 • • 發佈:2019-02-03
需求:
利用先序遍歷序列和中序遍歷序列來建立兩棵二叉樹,並判斷是否相等
需要先將建立二叉樹
建立的方法是將該二叉樹的先序的序列和中序的序列分別儲存到Pre陣列和Mid陣列中,它們的儲存順序如下:
判斷兩棵樹是否相等
採用遞迴的方法,用先序,中序,後序遍歷的方法對兩棵樹每個資料判斷是否相等
- 兩棵樹都為空,返回1
- 兩棵樹不相等,返回0
- 兩棵樹相等,返回1
程式碼解析及程式碼如下:
#include <stdio.h>
#include <string.h>
typedef char TElemType;
////儲存先序和中序序列字元陣列
char Pre[100 ],Mid[100];
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//建立二叉樹
//Pre_star.....代表陣列下標
BiTree BiTree_Creat(BiTree T,int Pre_start,int Pre_end,int Mid_start,int Mid_end)
{
int i;
int LtreeLen,RtreeLen;
T=(BiTree)malloc(sizeof(BiTNode));
if (!T)
{
printf("malloc_error!");
}
//////先序很容易找到根結點,中序的話需要遍歷
T->data=Pre[Pre_start];//取先序序列中第一個字元作為根結點的資料域值
//////查詢中序序列中的根結點
for(i=Mid_start;Mid[i]!=T->data;)
{
++i;////根結點在序列i位置
}
////計算左右子樹結點個數
LtreeLen=i-Mid_start;
RtreeLen=Mid_end-i;
if(LtreeLen)////不斷深入左子樹
{
T->lchild=BiTree_Creat(T,Pre_start+1,Pre_start+LtreeLen,Mid_start,Mid_start+LtreeLen-1);
}
else
{
T->lchild=NULL;
}
if(RtreeLen)////不斷深入右子樹
{
T->rchild=BiTree_Creat(T,Pre_end-RtreeLen+1,Pre_end,Mid_end-RtreeLen+1,Mid_end);
}
else
{
T->rchild=NULL;
}
return T;
}
////先序判斷兩樹是否相等
int Pre_Cmp(BiTree T1,BiTree T2)
{
//如果兩樹都為空,返回1
if(!T1&&!T2)
{
return 1;
}
if(T1&&T1)
{
if(T1->data==T2->data)
{
if(Pre_Cmp(T1->lchild,T2->lchild))//遞迴左子樹每個資料是否相等
{
if(Pre_Cmp(T1->rchild,T2->rchild))//遞迴右子樹每個資料是否相等
{
return 1;//兩樹完全相等,返回1
}
}
}
}
return 0;//兩樹不相等,返回0
}
////中序判斷兩樹是否相等
int In_Cmp(BiTree T1,BiTree T2)
{
if(!T1&&!T2)
{
return 1;
}
if(T1&&T2)
{
if(In_Cmp(T1->lchild,T2->lchild))
{
if(T1->data==T2->data)
{
if(In_Cmp(T1->rchild,T2->rchild))
{
return 1;
}
}
}
}
return 0;
}
////後序判斷兩樹是否相等
int Last_Cmp(BiTree T1,BiTree T2)
{
if(!T1&&!T2)
{
return 1;
}
if(T1&&T2)
{
if(Last_Cmp(T1->lchild,T2->lchild))
{
if(T1->rchild,T2->rchild)
{
if(T1->data==T2->data)
{
return 1;
}
}
}
}
return 0;
}
int main()
{
BiTree T1,T2;
int Is_Bitree;
int ch;
strcpy(Pre,"abcde");//先序順序
strcpy(Mid,"bdcae");//中序順序
T1=BiTree_Creat(T1,0,4,0,4);
T2=BiTree_Creat(T2,0,4,0,4);
while(1)
{
printf("***///T1T2相等或都為空則輸出1,否則反之///***\n\n");
printf("1_Pre_Cmp\n");
printf("2_In_Cmp\n");
printf("3_Last_Cmp\n");
printf("4_exit\n");
scanf("%d",&ch);
switch(ch)
{
case 1:Is_Bitree=Pre_Cmp(T1,T2);printf("%d",Is_Bitree);break;
case 2:Is_Bitree=In_Cmp(T1,T2);printf("%d",Is_Bitree);break;
case 3:Is_Bitree=Last_Cmp(T1,T2);printf("%d",Is_Bitree);break;
case 4:return;
default:printf("input error!");
}
printf("\n");
}
return 0;
}