zoukankan      html  css  js  c++  java
  • 7-1 树的同构 (25 分)

    图27-1 树的同构 (25 分)

    给定两棵树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
    

      

    #include<stdio.h>
    #include<stdlib.h>
    #include<malloc.h>
    #include<iostream>
    using namespace std;
    typedef struct BiTree
    {
        char data[20];
        int lchild[20];
        int rchild[20];
    }BiTree;
    int Judge(BiTree T1, int pos1, BiTree T2, int pos2)
    {
        int l1 =  T1.lchild[pos1];
        int r1 =  T1.rchild[pos1];
        int l2 =  T2.lchild[pos2];
        int r2 =  T2.rchild[pos2];
        if(T1.data[l1]==T2.data[l2]&&T1.data[r1]==T2.data[r2])
            return 1;
        if(T1.data[l1]==T2.data[r2]&&T1.data[r1]==T2.data[l2])
            return 1;
        return 0;
    }
    int BuildTree(BiTree &T)
    {
        int N;
        scanf("%d", &N);
        for(int i=0; i<N; i++){
            getchar();//用scanf的话得吃一个换行符,cin则不用
            char data, lchild, rchild;
            scanf("%c %c %c", &data, &lchild, &rchild);
            //cin>>data>>lchild>>rchild;
            T.data[i] = data;
            int l = lchild - '0';
            int r = rchild - '0';
            if(l < 0)
                l = 15;
            if(r < 0)
                r = 15;
            T.lchild[i] = l;
            T.rchild[i] = r;
        }
        T.data[15] = '1';
        return N;
    }
    int main()
    {
        BiTree T1, T2;
        int N1 = BuildTree(T1);
        int N2 = BuildTree(T2);
        if(N1 != N2){//节点数不一致
            printf("No");
            return 0;
        }
        for(int i=0; i<N1; i++){
            int j;
            for(j=0; j<N2; j++){
                if(T1.data[i] == T2.data[j]){
                   int is = Judge(T1, i, T2, j);
                   if(!is){//找到但是左右孩子不一样
                      printf("No");
                      return 0;
                   }
                   break;
                }
            }
            if(j == N2){//没找到
                printf("No");
                return 0;
            }
        }
        printf("Yes");
    
    }
    

      

  • 相关阅读:
    javascript获取url地址问好后面的值,包括问号
    给Object扩展新方法
    关于hasOwnProperty()方法的应用
    javascript if 与 if else 的一点小认识
    express中路由设置的坑-----1
    javascript数组顺序-----1冒泡的另一种比较好理解的写法
    进程的控制与状态细化
    进程的定义与控制
    进程的定义与控制
    进程引入
  • 原文地址:https://www.cnblogs.com/Jie-Fei/p/10153615.html
Copyright © 2011-2022 走看看