1. 程式人生 > >二叉樹——判斷兩棵二叉樹是否相等(先序和中序遍歷序列建立二叉樹)

二叉樹——判斷兩棵二叉樹是否相等(先序和中序遍歷序列建立二叉樹)

需求:

利用先序遍歷序列和中序遍歷序列來建立兩棵二叉樹,並判斷是否相等

需要先將建立二叉樹

建立的方法是將該二叉樹的先序的序列和中序的序列分別儲存到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; }