树的同构
2019-10-03 14:16:23
本文总阅读量

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#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);


}
上一页
2019-10-03 14:16:23
下一页