链接

树的同构

题意

同构的定义: 给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。

给两棵树,判断是否同构

做法

先建树,然后判断,知道怎么判断就知道怎么写了,具体实现看代码

代码

/*
Name: hello world.cpp
Author: AA
Description: 唯代码与你不可辜负
*/
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define maxn 20100
typedef struct Node {
char data;
int left;
int right;
} Tree;
Tree t1[maxn], t2[maxn];
int build(Tree T[]) {
int n, cherk[maxn], root = -1;
char cl, cr;
scanf("%d", &n);
getchar();
if(n) {
for(int i = 0; i < n; i++)
cherk[i] = 0;
for(int i = 0; i < n; i++) {
scanf("%c %c %c", &T[i].data, &cl, &cr);
getchar();
if(cl != '-') {
T[i].left = cl - '0';
cherk[T[i].left] = 1;
} else
T[i].left = -1;
if(cr != '-') {
T[i].right = cr - '0';
cherk[T[i].right] = 1;
} else
T[i].right = -1;
}
for(int i = 0; i < n; i++) {
if(cherk[i] == 0) {
root = i;
break;
}
}
}
return root;
}
bool Isomorphic(int root1, int root2) {
if(root1 == -1 && root2 == -1) return true;//都是空的,符合
else if((root1 == -1 && root2 != -1) || (root1 != -1 && root2 == -1)) return false; //一个空一个不空当然不符合
else if(t1[root1].data != t2[root2].data) return false; //元素不相等不符合
else if(t1[root1].left == -1 && t2[root2].left == -1) //左子树都是空的话,就判断右子树
return Isomorphic(t1[root1].right, t2[root2].right);
else if(t1[t1[root1].left].data == t2[t2[root2].left].data)//左子树的元素都相同的话就把他们的左右子树都判断
return (Isomorphic(t1[root1].left, t2[root2].left) && Isomorphic(t1[root1].right, t2[root2].right));
else //最后是把左右子树交换来判断
return (Isomorphic(t1[root1].left, t2[root2].right) && Isomorphic(t1[root1].right, t2[root2].left));
}
int main() {
int root1, root2;
root1 = build(t1);
root2 = build(t2);
if(Isomorphic(root1, root2))
puts("Yes");
else
puts("No");
}

PAT-树的同构的更多相关文章

  1. PAT 03-树1 树的同构 (25分)

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

  2. 03-树1 树的同构 (C语言链表实现)

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h& ...

  3. BZOJ 4337: BJOI2015 树的同构 树hash

    4337: BJOI2015 树的同构 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4337 Description 树是一种很常见的数 ...

  4. SDUT 3340 数据结构实验之二叉树一:树的同构

    数据结构实验之二叉树一:树的同构 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定两棵树 ...

  5. PTA 深入虎穴 (正解)和树的同构

    在上一篇博客中分享了尝试用单链表修改程序,虽然在Dev上运行没有错误,但是PTA设置的测试点有几个没有通过,具体不清楚问题出现在哪里,所以现在把之前正确的程序放在这里. 7-2 深入虎穴 (30 分) ...

  6. 4337: BJOI2015 树的同构

    题解: 树的同构的判定 有根树从根开始进行树hash 先把儿子的f进行排序 $f[i]=\sum_{j=1}^{k} { f[j]*prime[j]} +num[i]$(我没有仔细想这样是不是树是唯一 ...

  7. [BJOI2015]树的同构

    嘟嘟嘟 判断树的同构的方法就是树上哈希. 如果树是一棵有根树,那么只要从根节点出发dfs,每一个节点的哈希值等于按传统方式算出来的子树的哈希值的结果.需要注意的是,算完子树的哈希值后要先排序再加起来, ...

  8. bzoj4337树的同构

    树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱,这个树就成为有根树. 对于两个树T1和T2,如果能够把树T1的所有点重 ...

  9. bzoj4337: BJOI2015 树的同构 树哈希判同构

    题目链接 bzoj4337: BJOI2015 树的同构 题解 树哈希的一种方法 对于每各节点的哈希值为hash[x] = hash[sonk[x]] * p[k]; p为素数表 代码 #includ ...

  10. 【BZOJ4337】BJOI2015 树的同构 括号序列

    [BZOJ4337]BJOI2015 树的同构 Description 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱 ...

随机推荐

  1. 继续聊WPF

    下面看一个Tick控件的例子,这只是演示,Tick单独使用没有意义. <TickBar Height="15" Width="180" Ticks=&qu ...

  2. PAT 1080. Graduate Admission

    It is said that in 2013, there were about 100 graduate schools ready to proceed over 40,000 applicat ...

  3. workspace 配置

    1.新建workspace 在配置好相关信息前,请勿引入工程代码,避免环境不完整的情况下编译进入长时间等待 2.设置工作窗体结构 建议使用Java模式开发窗体设置 3. 编码 工程全部采用UTF-8编 ...

  4. Timus - 1209 - 1, 10, 100, 1000...

    先上题目: 1209. 1, 10, 100, 1000... Time limit: 1.0 secondMemory limit: 64 MB Let's consider an infinite ...

  5. LINUX内核内存屏障

    =================                          LINUX内核内存屏障                          ================= By ...

  6. caffe中ConvolutionLayer的前向和反向传播解析及源码阅读

    一.前向传播 在caffe中,卷积层做卷积的过程被转化成了由卷积核的参数组成的权重矩阵weights(简记为W)和feature map中的元素组成的输入矩阵(简记为Cin)的矩阵乘积W * Cin. ...

  7. runtime objc_msgSend

    runtime objc_msgSend 字数1781 阅读245 评论2 喜欢7  前言 想要通过runtime发送消息,就必须要掌握runtime如何发送消息,是调用哪个函数?又是如何调用的?本篇 ...

  8. luogu2754 星际转移问题 网络流

    题目大意:地球与月球间有可容纳无限人的太空站,还有在太空站与星球间按周期行驶的.有固定容量的太空船,每一艘太空船从一个太空站驶往任一太空站耗时均为 1.地球上有一定数量的人,问所有人到月球最少需要多少 ...

  9. java中与运算,或运算,异或运算,取反运算

      //与运算 &  规则 :都为1时才为1        System.out.println( 7 & 9);        /*         *  7二进制 0111     ...

  10. Swift 3 关于Date的一些操作

    前言 最近在写关于日期的一些操作,所以整理了一下这方面的一些知识 本Demo使用的是playground. 我们以前使用的都是NSDate类进行日期的操作,在Swift 3.0中,我们就可以使用更加S ...