更新、更全的《数据结构与算法》的更新网站,更有python、go、人工智能教学等着你:https://www.cnblogs.com/nickchen121/p/11407287.html

一、题意理解

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

输入格式:输入给出2棵二叉树的信息:

  • 先在一行中给出该树的结点树,随后N行

  • 第i行对应编号第i个结点,给出该结点中存储的字母、其左孩子结点的编号、右孩子结点的编号

  • 如果孩子结点为空,则在相应位置给出“-”

如下图所示,有多种表示的方式,我们列出以下两种:

二、求解思路

  1. 二叉树表示
  2. 建二叉树
  3. 同构判别

2.1 二叉树表示

结构数组表示二叉树:静态链表

/* c语言实现 */

#define MaxTree 10
#define ElementType char
#define Tree int
#define Null -1 struct TreeNode
{
ElementType Element;
Tree Left;
Tree Right;
} T1[MaxTree], T2[MaxTree];

2.2 程序框架搭建

需要设计的函数:

  • 读数据建二叉树
  • 二叉树同构判别
/* c语言实现 */

int main():
{
建二叉树1;
建二叉树2;
判别是否同构并输出; return 0;
} int main()
{
Tree R1, R2; R1 = BuildTree(T1);
R2 = BuildTree(T2);
if (Isomorphic(R1, R2)) printf("Yes\n");
else printf("No\n"); return 0;
}

2.3 如何建二叉树

/* c语言实现 */

Tree BuildTree(struct TreeNode T[])
{
...;
scanf("%d\n", &N); // 输入需要建立树的长度
if (N) {
...;
for (i=0; i<N; i++) {
scanf("%c %c %c\n", &T[i].Element, &cl, &cr);
...;
}
...;
Root = ??? // 可以通过T[i]中没有任何结点的left(cl)和right(cr)指向他这个条件获取。
}
return Root;
}
/* c语言实现 */

Tree BuildTree(struct TreeNode T[])
{
...;
scanf("%d\n", &N); // 输入需要建立树的长度
if (N) {
for (i=0; i<N; i++) check[i] = 0;
for (i=0; i<N; i++) {
scanf("%c %c %c\n", &T[i].Element, &cl, &cr);
if (cl != '-'){
T[i].Left = cl-'0';
check[T[i].Left] = 1;
}
else T[i].Left = Null;
...; // 对cr的对应处理
}
for (i=0; i<N; i++)
if (!check[i]) break;
Root = i; // 可以通过T[i]中没有任何结点的left(cl)和right(cr)指向他这个条件获取。
}
return Root;
}

2.4 如何判别两二叉树同构

/* c语言实现 */

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)) // 根的左右结点没有子树
return 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));
}
}

小白专场-树的同构-c语言实现.md的更多相关文章

  1. 小白专场-树的同构-python语言实现

    目录 一.题意理解 二.求解思路 更新.更全的<数据结构与算法>的更新网站,更有python.go.人工智能教学等着你:<https://www.cnblogs.com/nickch ...

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

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

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

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

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

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

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

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

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

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

  7. 4337: BJOI2015 树的同构

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

  8. [BJOI2015]树的同构

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

  9. bzoj4337树的同构

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

随机推荐

  1. 6、高级的数组的复制(test4.java)

    这里指的高级,并不是过么高大上,而是说我们可以调用系统函数,直接对数组进行复制,并且这个函数的强大并不止局限于,对数组的复制,而且可以对数组进行截取,在指定位置插入或删除某个元素. 本篇只介绍数组的复 ...

  2. Java枚举类型 enum

    定义 An enum type is a special data type that enables for a variable to be a set of predefined constan ...

  3. Vue系列:.sync 修饰符的作用及使用范例

    作用:对传递给子组件的 prop 数据进行“双向绑定”.(正常情况下,prop 的数据都是单向数据流) 代码参考如下: 父组件部分 子组件部分

  4. p2p 打洞专场(转)

    就像1000个人眼中有1000个哈姆雷特一样,每个人眼中的区块链也是不一样的!作为技术人员眼中的区块链就是将各种技术的融合,包括密码学,p2p网络,分布式共识机制以及博弈论等.我们今天就来讨论一下区块 ...

  5. python语言特点简介 以及在Windows以及Mac中安装以及配置的注意事项

    正如前一篇随笔所提到的,python属于解释型语言 python语言有两个特点: 1.胶水语言(历史遗留问题,原来Perl语言作为Unix内置标准件,获得极大追捧,作为竞争者的python一开始是作为 ...

  6. AUTOCAD二次开发-----删除一个图层里面的所有对象

    https://blog.csdn.net/aasswwe/article/details/40899759 private void Test() { // 获取当前文档和数据库 Document ...

  7. opencv3 编程入门学习笔记(一): 基本函数介绍

    滤波 blur (均值滤波) 均值滤波是典型的线性滤波算法, 主要方法为领域平均法(即用一片图像区域的各个像素的平均值来代替原图像中的各个像素值) 缺点: 不能很好的保护图像细节, 在图像去噪的同时也 ...

  8. Unity进阶之ET网络游戏开发框架 05-搭建自己的第一个Scene

    版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...

  9. c++中strcmp,strcopy函数的使用

    1.strcmp(str1,str2) C/C++函数,比较两个字符串, 设这两个字符串为str1,str2,若str1==str2,则返回零:若str1<str2,则返回负数:若str1> ...

  10. 记录一下vue transition 过渡各状态()

    .slide-fade-enter{   opacity: 0;   transform: translateX(100px);   /*从哪里开始过渡:在过渡之前我就把位置定义在100px的位置,并 ...