PTA 树的同构 (25分)

缺乏、安全感 2023-07-25 11:23 110阅读 0赞

PTA 树的同构 (25分)

1
输入格式:
输入给出2棵二叉树树的信息。对于每棵树,首先在一行中给出一个非负整数N (≤10),即该树的结点数(此时假设结点从0到N−1编号);随后N行,第i行对应编号第i个结点,给出该结点中存储的1个英文大写字母、其左孩子结点的编号、右孩子结点的编号。如果孩子结点为空,则在相应位置上给出“-”。给出的数据间用一个空格分隔。注意:题目保证每个结点中存储的字母是不同的。
输出格式:
如果两棵树是同构的,输出“Yes”,否则输出“No”。
输入样例1(对应图1):

  1. 8
  2. A 1 2
  3. B 3 4
  4. C 5 -
  5. D - -
  6. E 6 -
  7. G 7 -
  8. F - -
  9. H - -
  10. 8
  11. G - 4
  12. B 7 6
  13. F - -
  14. A 5 1
  15. H - -
  16. C 0 -
  17. D - -
  18. E 2 -

输出样例1:

  1. Yes

输入样例2(对应图2):

  1. 8
  2. B 5 7
  3. F - -
  4. A 0 3
  5. C 6 -
  6. H - -
  7. D - -
  8. G 4 -
  9. E 1 -
  10. 8
  11. D 6 -
  12. B 5 -
  13. E - -
  14. H - -
  15. C 0 2
  16. G - 3
  17. F - -
  18. A 1 4

输出样例2:

  1. No

【程序思路】
首先需要根据输入找出根节点,将输入利用静态链表的方式保存,没有被指向的编号就是根节点。再调用函数递归判断树是否同构。
【程序实现】

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. struct tree{
  4. int left,right;
  5. char data;
  6. }a[15],b[15];
  7. int getHhead(struct tree a[]) {
  8. int n, head = 12, check[15] = {
  9. 0};
  10. cin>>n;
  11. getchar();
  12. for (int i = 0; i < n; i++) {
  13. string s;
  14. getline(cin,s);
  15. a[i].data = s[0];
  16. a[i].left = s[2] != '-' ? s[2]-'0' : 12;
  17. a[i].right = s[4] != '-' ? s[4]-'0' : 12;
  18. check[a[i].left] = 1;
  19. check[a[i].right] = 1;
  20. }
  21. if(n)
  22. for (head = 0; head < n;head++)
  23. if (!check[head]) break;
  24. return head;
  25. }
  26. bool jdg(int head1, int head2) {
  27. if(head1 == 12 && head2 == 12)
  28. return true;
  29. else if((head1 == 12 && head2 != 12) || (head1 != 12 && head2 == 12))
  30. return false;
  31. else if(a[head1].data != b[head2].data)
  32. return false;
  33. else if(a[head1].left == 12 && b[head2].left == 12)
  34. return jdg(a[head1].right, b[head2].right);
  35. else if(a[head1].left != 12 && b[head2].left !=12 && a[a[head1].left].data == b[b[head2].left].data)
  36. return (jdg(a[head1].left , b[head2].left) && jdg(a[head1].right , b[head2].right));
  37. else
  38. return jdg(a[head1].left , b[head2].right) && jdg(a[head1].right , b[head2].left);
  39. }
  40. int main(){
  41. int head1, head2;
  42. head1 = getHhead(a);
  43. head2 = getHhead(b);
  44. if (jdg(head1 , head2))
  45. cout<<"Yes\n";
  46. else
  47. cout<<"No\n";
  48. return 0;
  49. }

发表评论

表情:
评论列表 (有 0 条评论,110人围观)

还没有评论,来说两句吧...

相关阅读

    相关

    7-1 树的同构 (30 point(s)) 给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,

    相关 7-3 25

    给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互

    相关

    这里给出一种O(N)判断两棵树是否同构的方法:首先找出两个树的重心,然后对这个重心进行树的哈希。然后比对哈希结果, 没有找到例题, 但是有一个判断多棵树是否同构的例题,因为