//树的同构
#include <stdio.h>
#include <stdlib.h>
typedef struct BiNode {
char data;
int left, right;
}bNode, *bTree;
bNode t1[11], t2[11];
//传数组进入
int buildTree(bTree t)
{
int n, root, check[11];
char cl[2], cr[2], src[2];
//io控制需要注意 \n
scanf("%d", &n);
if (!n) return -1;
for (int i = 0; i < n; i ++ ) check[i] = 0;
for (int i = 0; i < n; i ++ )
{
scanf("%s %s %s", src, cl, cr);
t[i].data = src[0];
if (cl[0] != '-')
{
t[i].left = cl[0] - '0';
check[t[i].left] = 1;//拥有父节点
}
else t[i].left = -1;
if (cr[0] != '-')
{
t[i].right = cr[0] - '0';
check[t[i].right] = 1;
}
else t[i].right = -1;
}
for (int i = 0; i < n; i ++ )
if (!check[i]) root = i;
return root;
}
int judge(int r1, int r2)
{
if (r1 == -1 && r2 == -1) //空树
return 1;
//空与非空
if ((r1 == -1 && r2 != -1) || (r1 != -1 && r2 == -1))
return 0;
if (t1[r1].data != t2[r2].data) //根节点不同
return 0;
//根节点相同
//左孩子都空 只能看右孩子
if (t1[r1].left == -1 && t2[r2].left == -1)
return judge(t1[r1].right, t2[r2].right);
if ((t1[r1].left != -1 && t2[r2].left != -1) &&
(t1[t1[r1].left].data == t2[t2[r2].left].data))
return (judge(t1[r1].left, t2[r2].left) &&
judge(t1[r1].right, t2[r2].right));
//根节点相同 左孩子不同 说明位置互换
else return (judge(t1[r1].left, t2[r2].right) &&
judge(t1[r1].right, t2[r2].left));
}
int main()
{
int root1, root2;
root1 = buildTree(t1);
root2 = buildTree(t2);
if (judge(root1, root2)) printf("Yes\n");
else printf("No\n");
return 0;
}
pta 数据结构-树的同构
最新推荐文章于 2024-09-29 16:46:50 发布