#define null -1
struct node {
int left, right;
char data;
} tree1[100], tree2[100];
int book[1000];
int build(struct node tree[]) {
int n, i, root;
memset(book, 0, sizeof(book)); //节点初始化
char left, right;
scanf("%d", &n);
getchar();
for (i = 0; i < n; i++) {
scanf("%c %c %c\n", &tree[i].data, &left, &right);
if (left == '-') tree[i].left = null; //判断左右子树是否存在并标记
else {
tree[i].left = left - '0';
book[left - '0'] = 1;
}
if (right == '-') tree[i].right = null;
else {
tree[i].right = right - '0';
book[right - '0'] = 1;
}
}
root = null; //必须初始化
for (i = 0; i < n; i++) {
if (book[i] == 0) root = i;
}
return root;
}
int judge(int root1, int root2) {
if (root1 == null && root2 == null) return 1; // 根节点都为空则相同
if ((root1 == null && root2 != null) || (root1 != null && root2 == null)) return 0; //一个空一个不空
if (tree1[root1].data != tree2[root2].data) return 0; //两个根节点相同,但数值不同
if (tree1[tree1[root1].left].data == tree2[tree2[root2].left].data) { //左子树的值相等,则判断右子树
return judge(tree1[root1].right, tree2[root2].right);
}
else { //调换第一棵树看是否能得到第二棵树
return judge(tree1[root1].left, tree2[root2].right) && judge(tree1[root1].right, tree2[root2].left);
}
}
int main() {
int root1, root2;
root1 = build(tree1);
root2 = build(tree2);
judge(root1, root2) == 1 ? printf("Yes\n") : printf("No\n");
return 0;
}
7-3 树的同构 (25分)
最新推荐文章于 2021-03-06 16:58:09 发布
776

被折叠的 条评论
为什么被折叠?



