树的同构
- 题目描述
- C语言实现
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>
#define MaxSize 100
typedef char ElementType;
struct TNode
{
ElementType Elem;
int Left;
int Right;
}T1[MaxSize],T2[MaxSize];
int BuildeTree(struct TNode T[])
{
int N;
int Root = -1;
int i = 0;
char cl, cr;
int check[MaxSize];
scanf("%d\n",&N);
if (N != 0)
{
for (i = 0;i < N;i++)
{
check[i] = 0;
}
for (i = 0;i < N;i++)
{
scanf("%c %c %c\n",&T[i].Elem,&cl,&cr);
if (cl != '-')
{
T[i].Left = cl - '0';
check[T[i].Left] = 1;
}
else
{
T[i].Left = -1; //-1表示没有子节点
}
if (cr != '-')
{
T[i].Right = cr - '0';
check[T[i].Right] = 1;
}
else
{
T[i].Right = -1; //-1表示没有子节点
}
}
for (i = 0; i < N;i++)
{
if (!check[i])
{
Root = i;
break;
}
}
}
return Root;
}
bool Isomorphism(int R1,int R2)
{
//先对基本情况进行判断
if (R1 == -1 && R2 == -1)
{
return true; //两颗树都是空树,一定同构
}
if ((R1 == -1 && R2 != -1)
||(R1 != -1 && R2 == -1))
{
return false; //一颗为空树 另一个颗不是空树 一定不同构
}
if (T1[R1].Elem != T2[R2].Elem)
{
return false; //两颗树的根节点不相同 必定不同构
}
if (T1[R1].Left == -1 && T2[R2].Left == -1)
{
Isomorphism(T1[R1].Right, T2[R2].Right); //左子树为空 则判断其右子树
}
if ((T1[R1].Left != -1 && T2[R2].Left != -1) &&
(T1[T1[R1].Left].Elem == T2[T2[R2].Left].Elem))
{
//不用交换左右子树
return (Isomorphism(T1[R1].Left,T2[R2].Left) && Isomorphism(T1[R1].Right, T2[R2].Right));
}
else
{
//需要交换左右子树
return (Isomorphism(T1[R1].Left, T2[R2].Right) && Isomorphism(T1[R1].Right, T2[R2].Left));
}
}
int main()
{
int R1, R2;
R1 = BuildeTree(T1);
R2 = BuildeTree(T2);
if (Isomorphism(R1,R2))
{
printf("Yes");
}
else
{
printf("No");
}
// system("pause");
return 0;
}
值得一提的是,这道题目也是用递归的思想来解决。