判定兩棵樹是否是同構樹(C語言)
阿新 • • 發佈:2019-02-09
問題描述:
如果樹 T1 通過交換其(某些)節點的左右兒子變換成樹 T2,則稱樹 T1 與樹 T2 同構。
程式碼:
//樹同構的判定
#include<stdio.h>
#include<stdlib.h>
#define YES 1
#define NO 0
typedef struct DTree* tree;
typedef char ElementType;
void createTree(tree tmp);
int isomorphic(tree tree1, tree tree2);
/**************************
*定義樹的結構體
*data : 樹儲存的資料
*left : 樹的左兒子
*right : 樹的右兒子
***************************/
struct DTree
{
ElementType data;
tree left;
tree right;
};
/**************************
*建立一個二叉樹
*tmp : 樹的基本結構
***************************/
void createTree(tree tmp)
{
ElementType ch;
scanf("%c", &ch);
if (ch == ' ')
{
tmp = NULL;
}
else
{
tmp = (tree)malloc(sizeof(DTree));
if (tmp == NULL)
{
return;
}
tmp->data = ch;
createTree(tmp->left);
createTree(tmp->right);
}
}
/**************************
*判定兩棵樹是否為同構樹
*tree1 : 一棵待判定樹
*tree2 : 另一棵待判定樹
***************************/
int isomorphic(tree tree1, tree tree2)
{
//如果兩棵樹為空,則同構
if (tree1 == NULL && tree2 == NULL)
{
return YES;
}
//如果一棵樹為空,另一棵樹不為空,則不同構
if ((tree1 == NULL && tree2 != NULL) || (tree1 != NULL && tree2 == NULL))
{
return NO;
}
//如果兩棵樹根節點的資料不同,則不同構
if (tree1->data != tree2->data)
{
return NO;
}
//如果兩棵樹左節點都為空,則比較右節點
if (tree1->left == NULL && tree2->left == NULL)
{
return isomorphic(tree1->right, tree2->right);
}
//如果兩棵樹左節點不為空且資料相同,則比較左左,右右
if ((tree1->left != NULL && tree2->left != NULL) && (tree1->data == tree2->data))
{
return isomorphic(tree1->left, tree2->left) && isomorphic(tree1->right, tree2->right);
}
//否則比較左右,右左
else
{
return isomorphic(tree1->left, tree2->right) && isomorphic(tree1->right, tree2->left);
}
}