1. 程式人生 > >判定兩棵樹是否是同構樹(C語言)

判定兩棵樹是否是同構樹(C語言)

問題描述:

如果樹 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); } }