数据结构(三)—— 树(4):树的同构
数据结构系列内容的学习目录→\rightarrow→浙大版数据结构学习系列内容汇总。
题意理解: 给定两棵树T1和T2。如果T1可以通过若干次左右子结点互换就变成T2,则我们称两棵树是“同构”的。
现给定两棵树,如下图所示,请判断它们是否是同构的。
输入格式: 输入给出两棵二叉树的信息:
∘\circ∘ 先在一行中给出该树的结点数,随后n行;
∘\circ∘ 第 i 行对应编号第 i 个结点,给出该结点中存储的字母、其左子结点的编号、右子结点的编号;
∘\circ∘ 如果子结点为空,则在相应位置上给出“-”。
输入样例:
求解思路: 1. 二叉树表示
2. 建二叉树
3. 同构判别
二叉树表示: 结构数组表示二叉树,物理上的存储是数组,思想是一种链表思想,有链表的灵活性,但以数组形式存储,称其为静态链表。
二叉树用结构数组来表示,表示形式不是唯一的,也可以表示为如下图所示。
#define MaxTree 10
#define ElementType char
#define Tree int
#define Null -1 //结点没有下标时,定义为-1,表示指向为空struct TreeNode
{ElementType Element;Tree Left; // 左子树的下标Tree Right; // 右子树的下标
}T1[MaxTree],T2[MaxTree];
程序框架搭建:
int main()
{建二叉树1建二叉树2判别是否同构并输出return 0 ;
需要设计的函数: 1. 读数据建二叉树
2. 二叉树同构判别
int main()
{Tree R1,R2;R1= BuildTree(T1);R2= BuildTree(T2);if(lsomorphic(R1,R2)) cout<< "是" << endl;else cout<< "否" << endl;return 0 ;
树的同构判断的完整实现代码如下所示。
#include<iostream>
using namespace std;
#define MaxTree 10
#define ElementType char
#define Tree int
#define Null -1
struct TreeNode {ElementType data; // 存值 Tree left; // 左子树的下标 Tree right; // 右子树的下标
}T1[MaxTree], T2[MaxTree];// 返回根结点的第一种方法(根节点编号未出现在其他结点编号的后面,创建一个check数组来确定)
// 建二叉树,返回根结点
Tree BuildTree(struct TreeNode T[])
{int i;int n;int check[MaxTree]; //创建一个check数组来确定根节点,若在静态链表中未出现的下标则为根节点char left, right;Tree root = Null; //若n为0,返回Nullcin >> n;if (n) {for (i = 0; i < n; i++) {check[i] = 0;}for (i = 0; i < n; i++) {cin >> T[i].data >> left >> right;if (left != '-') {T[i].left = left - '0'; //若输入不为'-',那字符减去字符0转换为整型数值check[T[i].left] = 1; //把在静态链表中出现过的数值标记为1}else if (left == '-') {T[i].left = Null;}if (right != '-') {T[i].right = right - '0';check[T[i].right] = 1;}else if (right == '-') {T[i].right = Null;}}for (i = 0; i < n; i++) {if (!check[i]) {break;}}root = i;}return root;
}// 返回根结点的第二种方法 (根节点编号 = 行号和 - 左右结点编号和)
// 建二叉树,返回根结点
//Tree BuildTree(struct TreeNode T[])
//{// int n; //n为树的结点数
// int root = 0;
// char left, right;
// cin >> n;
// if (!n)
// return Null;
// for (int i = 0; i < n; i++)
// {// cin >> T[i].data >> left >> right;
// if (left == '-')
// T[i].left = Null;
// else
// {// T[i].left = left - '0';
// root -= T[i].left;
// }
// if (right == '-')
// T[i].right = Null;
// else
// {// T[i].right = right - '0';
// root -= T[i].right;
// }
// // 0 累加到 n-1
// root += i;
// }
// return root;
//}// 判断是否同构
bool Isomorphic(int R1, int R2)
{if (R1 == Null && R2 == Null) // 都为空 return true;if (R1 == Null && R2 != Null || R1 != Null && R2 == Null) // 一个为空,一个不为空return false;if (T1[R1].data != T2[R2].data) // 值不同return false;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].data == T2[T2[R2].left].data)) // 左儿子不为空且值相等return Isomorphic(T1[R1].left, T2[R2].left) && Isomorphic(T1[R1].right, T2[R2].right);else // 左儿子不为空且值不等 或者 某一个左儿子为空(有可能左边和右边同构,右边和左边同构)return Isomorphic(T1[R1].right, T2[R2].left) && Isomorphic(T1[R1].left, T2[R2].right);
}
int main() {Tree R1, R2;R1 = BuildTree(T1);R2 = BuildTree(T2);cout << "是否同构?" << endl;if (Isomorphic(R1, R2))cout << "是" << endl;elsecout << "否" << endl;system("pause");return 0;
}
运行上述代码,进行测试。
- 测试1:输入题目中图a)的两棵树
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 -
代码运行的测试效果如下图所示(对应题目中的图a))。
- 测试2:输入题目中图b)的两棵树
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
代码运行的测试效果如下图所示(对应题目中的图b))。
数据结构(三)—— 树(4):树的同构相关推荐
- 【数据结构】树与树的表示、二叉树存储结构及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树与哈夫曼编码、集合及其运算
1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R ...
- 高级数据结构与算法 | B树、B+树、B*树
文章目录 搜索结构 B树 B树的插入 B树的遍历 B树的性能 B+树 B+树的插入 B+树的遍历 B*树 B*树的插入 总结 搜索结构 如果我们有大量的数据需要永久存储,就需要存储到硬盘之中,但是硬盘 ...
- 高级数据结构与算法 | AVL树 (高度平衡树)
文章目录 AVL树 实现思路 数据结构 查找 平衡因子 旋转 右旋 左旋 右左双旋 左右双旋 插入 删除 AVL树的验证 中序遍历 平衡判断 AVL树的性能 完整代码实现 AVL树 AVL树是最先发明 ...
- 王道408数据结构——第五章 树与二叉树
文章目录 一.树的基本概念 树的性质 二.二叉树 满二叉树 完全二叉树 二叉排序树 平衡二叉树 二叉树的性质 完全二叉树的性质 三.二叉树的储存结构 顺序储存 链式存储 四.树的储存方式 双亲表示法 ...
- 数据结构与索引-- B+树索引
B+树索引 上一节中我们讨论的都是B+树的数据结构的由来以及他的一些操作,B+树索引在本质就是B+树在数据库中的一个实现,但是B+索引在数据库中有一个特点就是他的高扇出性,因此在数据库中,B+树的高度 ...
- 数据结构与算法--B树原理及实现
B树 前几篇文中讨论的数据结构我们都是假设所有的数据都存储在计算机的主存中.可说总要那么海量的数据需要通过个中数据结构去存储,我们不可能有这么多内存区存放这些数据.那么意味着我们需要将他们放磁盘.所以 ...
- (王道408考研数据结构)第五章树-第四节2:平衡二叉树(AVL)及其旋转
文章目录 一:AVL树基本概念 二:AVL树实现原理 (1)构建AVL树 (2)构建演示 (3)旋转方法 A:右单旋转调整(插入到较高左子树左侧) B:左单旋转调整(插入到较高右子树右侧) C:先左后 ...
- 《大话数据结构》读书笔记-树
写在前面:本文仅供个人学习使用.<大话数据结构>通俗易懂,适合整体做笔记输出,构建体系.并且文中很多图片来源于该书,如有侵权,请联系删除. 文章目录 6.2 树的定义 6.2.1 结点分类 ...
- 【数据结构——哈夫曼树及其应用】
[数据结构--哈夫曼树及其应用] 一.哈夫曼树的基本概念 二.哈夫曼树的构造算法 (一)哈夫曼树的构造过程 (二)哈夫曼树构造算法的实现 1.初始化 2.创建树 3.完整的创建哈夫曼树代码 三.哈夫曼 ...
- c++数据结构小助手 : 可视化树与图工具
c++数据结构小助手 : 可视化树与图工具 基于 graphics.h: 从文件 graph.txt 读图 格式如下: 命名:graph.txt 第一行,两个整数,n个点和m条边,边全都是有向边 第二 ...
最新文章
- C++虚继承内存布局===写得很牛!推荐
- Android - TextureView, SurfaceView和GLSurfaceView 以及 SurfaceTexture
- 少儿python编程培训-无锡江阴少儿Python编程培训一对一
- 64位Linux下JVM内存调设遇到GC问题的备忘
- e-mobile帐号状态存在异常_一文掌握异常检测的实用方法 | 技术实践
- 设计模式---桥接模式
- [USACO13NOV]Crowded Cows【暴力枚举】
- 中兴事件不会对中国高科技产生什么改变
- 安卓模拟器刷小米系统_小米5x原生rom系统刷机-小米5X MIUI10刷机包下载V9.7.21最新版-西西软件下载...
- 小米笔记本打开matlab,小米笔记本入手指南
- PyQt5中打开网址方法
- 5月1日起入境新加坡可使用IATA通行证,五一假期新加坡亲子游攻略
- 关于微信小程序开发过程中的页面刷新的解决方案
- 【Android】app应用内版本更新升级(DownloadManager下载,适配Android6.0以上所有版本)
- k8s使用volume将ConfigMap作为文件或目录直接挂载_【大强哥-k8s从入门到放弃06】Secret详解...
- 前端需要知道的CSS函数大全
- 微信公众号的申请以及测试号的申请
- 通过双目深度相机获取三维坐标
- Linux通过大文件创建文件系统
- 十大战略工具(4)—— SCQA架构