PAT-树的同构

链接

树的同构

题意

同构的定义: 给定两棵树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");
}

?

时间: 2024-09-30 08:03:11

PAT-树的同构的相关文章

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

给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的.例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A.B.G的左右孩子互换后,就得到另外一棵树.而图2就不是同构的. 图1 图2 现给定两棵树,请你判断它们是否是同构的. 输入格式: 输入给出2棵二叉树树的信息.对于每棵树,首先在一行中给出一个非负整数N (≤),即该树的结点数(此时假设结点从0到N−1编号):随后N行,第i行对应编号第i个结点,给出该结点中存储的1个英文大写字母.其左孩子结点

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

数据结构实验之二叉树一:树的同构 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是"同构"的.例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A.B.G的左右孩子互换后,就得到另外一棵树.而图2就不是同构的. 图1 图2 现给定两棵树,请你判断它们是否是同构的. Input 输入数据包含

03-树1 树的同构

给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的.例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A.B.G的左右孩子互换后,就得到另外一棵树.而图2就不是同构的. 图1 图2 现给定两棵树,请你判断它们是否是同构的. 输入格式: 输入给出2棵二叉树树的信息.对于每棵树,首先在一行中给出一个非负整数NN (\le 10≤10),即该树的结点数(此时假设结点从0到N-1N−1编号):随后NN行,第ii行对应编号第ii个结点,给出该结点中存储的

5-3 树的同构 (25分)

5-3 树的同构   (25分) 给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是"同构"的.例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A.B.G的左右孩子互换后,就得到另外一棵树.而图2就不是同构的. 图1 图2 现给定两棵树,请你判断它们是否是同构的. 输入格式: 输入给出2棵二叉树树的信息.对于每棵树,首先在一行中给出一个非负整数NN (\le 10≤10),即该树的结点数(此时假设结点从0到N-1N?1编号):随后NN行,第i

ZOJ--3602--Count the Trees【DFS+Hash】树的同构

链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3602 题意:给出一棵有n个节点的二叉树和一棵有m个节点的二叉树,给出每个节点的左右子树信息,问这两棵树有几个相同的子树. 思路:树的同构,比赛时没想法,赛后看的别人的解题报告.实际上是给每个节点的左右子树一个哈希值,不用像字符串哈希那么麻烦,直接给每个子树一个数字标记就行了,用map映射每个节点的左子树和右子树信息对应一个标记值,用DFS给两棵树的每个节点都赋一个哈

BZOJ 4337 树的同构

很明显,这应该是一道模版题(因为我很快就在一本书上找到了这道题的模版),不过令我比较奇怪的大概是有根树和无根树的概念,以及在这道题目中根有卵用吗? (看来树这一块的知识还是要补一下). 树的同构很明显应该是用hash来判断的,当然了,不同的人设计的hash函数不同了.这道题正确的应该是要在树的重心上面跑这道题的模版,(如果你要问我树的重心是啥,我只能跟你说,如果我知道的话,下面这份代码就不会把几乎所有的点都跑一次了,但是由于N<=50,M <= 50 很明显这样跑完还是很快的,事实证明也只跑了

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

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <stdbool.h> 5 6 typedef char ElemType; 7 8 typedef struct BinTree 9 { 10 ElemType data; 11 struct BinTree *left; 12 struct BinTree *right; 13 }BinTree; 14

PTA 树的同构(25 分)

7-1 树的同构(25 分) 给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是"同构"的.例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A.B.G的左右孩子互换后,就得到另外一棵树.而图2就不是同构的. 图1 图2 现给定两棵树,请你判断它们是否是同构的. 输入格式: 输入给出2棵二叉树树的信息.对于每棵树,首先在一行中给出一个非负整数N (≤10),即该树的结点数(此时假设结点从0到N?1编号):随后N行,第i行对应编号第i个结点,给出

树的同构

给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是"同构"的.例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A.B.G的左右孩子互换后,就得到另外一棵树.而图2就不是同构的. 图1 图2 现给定两棵树,请你判断它们是否是同构的. 输入格式: 输入给出2棵二叉树树的信息.对于每棵树,首先在一行中给出一个非负整数N (≤),即该树的结点数(此时假设结点从0到N?1编号):随后N行,第i行对应编号第i个结点,给出该结点中存储的1个英文大写字母.其

[BZOJ4337][BJOI2015]树的同构(树的最小表示法)

4337: BJOI2015 树的同构 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1023  Solved: 436[Submit][Status][Discuss] Description 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱,这个树就成为有根树. 对于两个树T1和T2,如果能够把树T1的所有点重新标号,使得树T1和树T2完全相 同,那么这两个树是同