问题描述:
如果树 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);
}
}