03-树1 树的同构

每次做课后布置的题就要做好久,这个题老师讲的时候用的是C语言,我想用C++中的vector做发现做的过程中遇到了许多的问题,老是出现程序宕掉的问题,但让我十分开心的是,改完以后居然一次就AC了别提有多激动了,不过这代码只是完成了功能,可读性做的很差,尤其是判断同构的函数,但是以后回过头来看还是很有意思的吧😂😂。

#include<iostream>
#include<vector>
using namespace std;
#define Null -1
typedef char ElemType;
struct TreeNode
{
	ElemType Data;
	int lchild;
	int rchild;
};
int TreeCreate(vector<TreeNode> &t, int n);
bool isomorphic(vector<TreeNode> &t1, int t1Root, vector<TreeNode> &t2, int t2Root);
int t1Root;
int t2Root;
int main()
{
	int n;
	cin >> n;
	vector<TreeNode> t1(n);
	t1Root = TreeCreate(t1, n);
	cin >> n;
	vector<TreeNode> t2(n);
	t2Root = TreeCreate(t2, n);
	if (isomorphic(t1, t1Root, t2, t2Root))
		cout << "Yes" << endl;
	else
		cout << "No" << endl;
	return 0;
}
int TreeCreate(vector<TreeNode> &t, int n)
{
	int root = -1;
	vector<int> arr(n, 1);
	for (int i = 0; i < n; i++)
	{
		char cl, cr;
		cin >> t[i].Data >> cl >> cr;
		if (cl == '-')
			t[i].lchild = Null;
		else
		{
			t[i].lchild = cl - '0';
			arr[t[i].lchild] = 0;
		}
		if (cr == '-')
			t[i].rchild = Null;
		else
		{
			t[i].rchild = cr - '0';
			arr[t[i].rchild] = 0;
		}
	}
	for (int i = 0; i < n; i++)
	{
		if (arr[i] != 0)
		{
			root = i;
			break;
		}
	}
	return root;
}
//要明确的一点是Null指的是树的存储结构为数组的下标 下标是从零开始 所以左儿子或者右儿子 为Null 即没有
bool isomorphic(vector<TreeNode> &t1, int t1Root, vector<TreeNode> &t2, int t2Root)
{
	if (t1Root == Null && t2Root == Null)
		return true;
	else if ((t1Root != Null && t2Root == Null) ||
		(t1Root == Null && t2Root != Null))
		return false;
	else if (t1[t1Root].Data != t2[t2Root].Data)
		return false;
	else if (t1[t1Root].lchild == Null && t2[t2Root].lchild == Null)
		return isomorphic(t1, t1[t1Root].rchild, t2, t2[t2Root].rchild);
	else if ((t1[t1Root].lchild != Null && t2[t2Root].lchild != Null) &&
		(t1[t1[t1Root].lchild].Data == t2[t2[t2Root].lchild].Data))
		return isomorphic(t1, t1[t1Root].lchild, t2, t2[t2Root].lchild) &&
		isomorphic(t1, t1[t1Root].rchild, t2, t2[t2Root].rchild);
	else
		return isomorphic(t1, t1[t1Root].rchild, t2, t2[t2Root].lchild)&&
		isomorphic(t1, t1[t1Root].lchild, t2, t2[t2Root].rchild);


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值