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):

     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:

    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:

    No
     1 #include <stdio.h>
     2 
     3 #define MaxTree 10
     4 #define ElementType char
     5 #define Tree int
     6 #define Null -1 
     7 int check[MaxTree];
     8 
     9 struct TreeNode
    10 {
    11     ElementType Element;
    12     Tree Left;
    13     Tree Right; 
    14 }T1[MaxTree],T2[MaxTree];
    15 
    16 Tree BuildTree(struct TreeNode T[])
    17 {
    18     int N,i;
    19     char cl,cr;
    20     Tree Root;
    21     scanf("%d
    ",&N);
    22     if(N)
    23     {
    24         for(i=0;i<N;i++)
    25         {
    26             check[i]=0;
    27         }
    28         for(i=0;i<N;i++)
    29         {
    30             scanf("%c %c %c
    ",&T[i].Element,&cl,&cr);
    31             if(cl!='-')
    32             {
    33                 T[i].Left=cl-'0';
    34                 check[T[i].Left]=1;
    35             }
    36             else T[i].Left=Null;
    37             if(cr!='-')
    38             {
    39                 T[i].Right=cr-'0';
    40                 check[T[i].Right]=1;
    41             }
    42             else T[i].Right=Null;
    43         }
    44         for(i=0;i<N;i++)
    45         {
    46             if(!check[i]) break;
    47         }
    48         Root = i;
    49     }
    50     else 
    51     {
    52         Root=0;
    53         T[Root].Left=Null;
    54         T[Root].Right=Null;
    55     }
    56     return Root;
    57 }
    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].Element!=T2[R2].Element)
    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))&&
    70         ((T1[T1[R1].Left].Element)==(T2[T2[R2].Left].Element)))
    71         return (Isomorphic(T1[R1].Left,T2[R2].Left)&&Isomorphic(T1[R1].Right,T2[R2].Right));
    72     else 
    73         return (Isomorphic(T1[R1].Left,T2[R2].Right)&&Isomorphic(T1[R1].Right,T2[R2].Left));
    74 }
    75 
    76 int main()
    77 {
    78     Tree R1,R2;
    79     R1=BuildTree(T1);//建二叉树1
    80     R2=BuildTree(T2);//建二叉树2
    81     if(Isomorphic(R1,R2))//判断是否同构
    82         printf("Yes
    ");
    83     else printf("No
    ");
    84     return 0;
    85 }

  • 相关阅读:
    酒香也怕巷子深,谈谈前端简历书写技巧。
    谈谈自己对语义化的认识
    服务器向用户返回的状态码和提示信息,常见的有以下一些(方括号中是该状态码对应的HTTP动词)
    Python常用库大全
    Python七大原则,24种设计模式
    Python设计模式(4):行为型
    Python设计模式(3):结构型
    Python设计模式(2):创建型
    python设计模式
    数据库的优化
  • 原文地址:https://www.cnblogs.com/jiamian/p/10714024.html
Copyright © 2011-2022 走看看