C语言 树的同构实现

使用静态链表存储二叉树,通过递归方法判断数的同构

#include "stdafx.h"
#include<stdio.h>
#define MaxTree 10
#define ElementType char
#define Tree int
#define Null -1

struct TreeNode
{
	ElementType Element;
	Tree Left;
	Tree Right;
}T1[MaxTree], T2[MaxTree];

Tree BuildTree(TreeNode T[]);
int Isomorphic(Tree R1, Tree R2);
int main()
{
	Tree R1, R2;
	R1 = BuildTree(T1);
	R2 = BuildTree(T2);
	if (Isomorphic(R1, R2))
		printf("Yes\n");
	else
		printf("No\n");
	return 0;
}

Tree BuildTree(TreeNode T[])
{
	int N;
	char cl, cr;
	int check[MaxTree];       // 判断每一个节点有没有节点指向
	int Root=Null;
	scanf_s("%d\n", &N);
	if (N)
	{
		for (int i = 0; i < N; i++)
			check[i] = 0;
		for (int i = 0; i < N; i++)
		{
			scanf_s("%c %c %c\n", &T[i].Element, &cl, &cr);
			if (cl != '-')
			{
				T[i].Left = cl - '0';
				check[T[i].Left] = 1;
			}
			else
			{
				T[i].Left = Null;
			}
			if (cr != '-')
			{
				T[i].Right = cr - '0';
				check[T[i].Right] = 1;
			}
			else
			{
				T[i].Right = Null;
			}
		}
		for (int i = 0; i < N; i++)
		{
			if (!check[i])
			{
				Root = i;
				break;
			}	
		}
	}
	return Root;
}

int Isomorphic(Tree R1, Tree R2)
{
	if (R1 == Null && R2 == Null)
		return 1;
	if ((R1 == Null && R2 != Null) || (R2 != Null && R1 == Null))
		return 0;
	if (T1[R1].Element != T2[R2].Element)
		return 0;
	if ((T1[R1].Left == Null) && (T2[R2].Left == Null))
		return Isomorphic(T1[R1].Right, T2[R2].Right);
	// 不需要交换左右子树
	if (((T1[R1].Left != Null) && (T2[R2].Left != Null)) &&
		((T1[T1[R1].Left].Element) == T2[T2[R2].Left].Element))
	{
		return (Isomorphic(T1[R1].Left, T2[R2].Left))&&
			(Isomorphic(T1[R1].Right, T2[R2].Right));
	}
	// 需要交换左右子数
	else
	{
		return (Isomorphic(T1[R1].Left, T2[R2].Right)) &&
			(Isomorphic(T1[R1].Right, T2[R2].Left));
	}


}

猜你喜欢

转载自blog.csdn.net/wwxy1995/article/details/82730973