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

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

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

    输入格式:

    输入给出2棵二叉树树的信息。对于每棵树,首先在一行中给出一个非负整数N (≤10),即该树的结点数(此时假设结点从0到N−1编号);随后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

    我的代码C++(g++6.5.0)

    #include <iostream>
    
    #define maxSize 10
    #define tree int
    #define elemType char
    #define Null -1
    
    struct treeNode {
    	elemType element;
    	tree left;
    	tree right;
    }T1[maxSize],T2[maxSize];
    int check[maxSize];
    tree bulidTree(struct treeNode T[]) {
    	tree root = Null;
    	int N,i;
    	char cl, cr;
    	scanf("%d
    ", &N);
    	if (N == 0) return Null;
        //rewind(stdin); // 键盘文件当前位置指针指向文件头(起到清空键盘缓冲区中无用字符的作用)
    	if (N) {
            for (i = 0; i < N; i++) check[i] = 0;
    		for (i = 0; i < N; i++) {
    			scanf("%c %c %c
    ", &T[i].element, &cl, &cr);
    			if (cl != '-') {
    				T[i].left = cl - '0';
    				check[T[i].left] = 1;
    			}
    			else {
    				T[i].left = Null;
    			}
    			if (cr != '-') {
    				T[i].right = cr - '0';
    				check[T[i].right] = 1;
    			}
    			else {
    				T[i].right = Null;
    			}
    		}
    		for (i = 0; i < N; i++) {
    			if (check[i] == 0) break;
    		}
    		root = i;
    	}
    	return root;
    }
    
    int isomorphic(tree r1,tree r2) {
    	if (r1 == Null && r2 == Null) return 1;
    	if (((r1==Null)&&(r2!=Null))||((r1!=Null)&&(r2==Null))) return 0;
    	if (T1[r1].element != T2[r2].element) return 0;
    	if ((T1[r1].left == Null) && (T2[r2].left == Null)) isomorphic(T1[r1].right, T2[r2].right);
    	if (((T1[r1].left!=Null)&&(T2[r2].left != Null))&&(T1[T1[r1].left].element == T2[T2[r2].left].element)) {
    		return (isomorphic(T1[r1].left, T2[r2].left) && isomorphic(T1[r1].right, T2[r2].right));
    	}else {
    		return (isomorphic(T1[r1].left, T2[r2].right) && isomorphic(T1[r1].right, T2[r2].left));
    	}
    }
    
    int main()
    {
    	tree r1, r2;
    	r1 = bulidTree(T1);
    	r2 = bulidTree(T2);
    	if (isomorphic(r1, r2)) printf("Yes
    ");
    	else printf("No
    ");
    	return 0;
    }
    
  • 相关阅读:
    Spring MVC Ajax 嵌套表单数据的提交
    Spring MVC 过滤静态资源访问
    Spring MVC 页面跳转时传递参数
    IDEA Maven 三层架构 2、运行 springMVC
    IDEA Maven 三层架构 1、基本的Archetype 搭建
    EasyUI DataGrid 基于 Ajax 自定义取值(loadData)
    Spring MVC Ajax 复杂参数的批量传递
    Mybatis Sql片段的应用
    在 Tomcat 8 部署多端口项目
    自动升级的设计思路与实现
  • 原文地址:https://www.cnblogs.com/TangYJHappen/p/13624230.html
Copyright © 2011-2022 走看看