zoukankan      html  css  js  c++  java
  • 树的同构

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


    图1

    图2

    现给定两棵树,请你判断它们是否是同构的。

    输入格式:

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

    输出格式:

    如果两棵树是同构的,输出“Yes”,否则输出“No”。

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

    8
    A 1 2
    B 3 4
    C 5 -
    D - -
    E 6 -
    G 7 -
    F - -
    H - -
    8
    G - 4
    B 7 6
    F - -
    A 5 1
    H - -
    C 0 -
    D - -
    E 2 -
    

    输出样例1:

    Yes
    

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

    8
    B 5 7
    F - -
    A 0 3
    C 6 -
    H - -
    D - -
    G 4 -
    E 1 -
    8
    D 6 -
    B 5 -
    E - -
    H - -
    C 0 2
    G - 3
    F - -
    A 1 4
    

    输出样例2:

    No
     1 #include <iostream>
     2 #include<algorithm>
     3 #include<cstdio>
     4 #include<cstring>
     5 #include<climits>
     6 #include<cstdlib>
     7 #include<cmath>
     8 
     9 using namespace std;
    10 #define OK 1
    11 #define Null -1
    12 #define Tree int
    13 #define ElemType char
    14 #define  MAX 100
    15 struct TNode
    16 {
    17     ElemType data;
    18     Tree left;
    19     Tree right;
    20 } T1[MAX],T2[MAX];//两个数 定义为全局变量
    21 int Create(struct TNode T[])
    22 {
    23     int n;
    24     int k=-1;//初始化为-1即Null!!!防止空树
    25     scanf("%d",&n);
    26     cin.get();
    27     if(n)
    28     {
    29 
    30         char  c,b;
    31         int check[n];//check用来找树的根,初始时全为0,一共n个结点,0~n-1,对每一个结点,将它的左右儿子对应的check都变为1;然后再遍历check,值为0的那个元素就是树的根。
    32         for(int i=0; i<n; i++)
    33             check[i]=0;
    34         for(int i=0; i<n; i++)
    35         {
    36             scanf("%c %c %c",&T[i].data,&b,&c);
    37             cin.get();//全部作为字符输入,所以注意吸收回车
    38             if(b!='-')//把所有子树为空的结点左右指针(数组下标)都赋为-1
    39             {
    40                 T[i].left=b-'0';
    41                 check[T[i].left]=1;
    42             }
    43             else
    44                 T[i].left=-1;
    45             if(c!='-')
    46             {
    47                 T[i].right=c-'0';
    48                 check[T[i].right]=1;
    49             }
    50             else
    51                 T[i].right=-1;
    52         }
    53         for(int i=0; i<n; i++)
    54             if(!check[i])
    55                 k= i;
    56     }
    57     return k;//返回根对应的数组下标
    58 }
    59 int Isomorphic(Tree R1,Tree R2)
    60 {
    61     if(R1==Null&&R2==Null)
    62         return 1;//双空
    63     if((R1==Null&&R2!=Null)||(R1!=Null&&R2==Null))
    64         return 0;一空一飞空
    65     if(T1[R1].data!=T2[R2].data)
    66         return 0;//树(子树)根对应值不等
    67     if(T1[R1].left==Null&&T2[R2].left==Null)
    68         return Isomorphic(T1[R1].right,T2[R2].right);//左子树都为空
    69     if((T1[R1].left!=Null&&T2[R2].left!=Null)&&(T1[T1[R1].left].data==T2[T2[R2].left].data))
    70         return Isomorphic(T1[R1].left,T2[R2].left)&&Isomorphic(T1[R1].right,T2[R2].right);//左右非空且左相等
    71     else
    72         return Isomorphic(T1[R1].left,T2[R2].right)&&Isomorphic(T1[R1].right,T2[R2].left);左右非空且不等
    73 }
    74 int  main()
    75 {
    76     int r1,r2;
    77     r1=Create(T1);
    78     r2=Create(T2);
    79     if(Isomorphic(r1,r2))
    80         printf("Yes
    ");
    81     else
    82         printf("No
    ");
    83     return 0;
    84 }
    View Code
  • 相关阅读:
    大同世界的Java 和.NET 开发
    关于Memcached 你了解多少?
    C#二进制与字符串之间的相互转换
    Nopcommerce主要用到的技术及特点
    小程序之路
    .NET方面的框架的整理和总结
    如何将FastReportOnlineDesign 灵活的应用到C/S B/S 程序当中?
    WebApi 的CRUD 的方法的应用
    关于EF 通用增删改查的封装
    基于Json序列化和反序列化通用的封装
  • 原文地址:https://www.cnblogs.com/hbhdhd/p/10805753.html
Copyright © 2011-2022 走看看