数据结构系列内容的学习目录→\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. 【数据结构】树与树的表示、二叉树存储结构及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树与哈夫曼编码、集合及其运算

    1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R ...

  2. 高级数据结构与算法 | B树、B+树、B*树

    文章目录 搜索结构 B树 B树的插入 B树的遍历 B树的性能 B+树 B+树的插入 B+树的遍历 B*树 B*树的插入 总结 搜索结构 如果我们有大量的数据需要永久存储,就需要存储到硬盘之中,但是硬盘 ...

  3. 高级数据结构与算法 | AVL树 (高度平衡树)

    文章目录 AVL树 实现思路 数据结构 查找 平衡因子 旋转 右旋 左旋 右左双旋 左右双旋 插入 删除 AVL树的验证 中序遍历 平衡判断 AVL树的性能 完整代码实现 AVL树 AVL树是最先发明 ...

  4. 王道408数据结构——第五章 树与二叉树

    文章目录 一.树的基本概念 树的性质 二.二叉树 满二叉树 完全二叉树 二叉排序树 平衡二叉树 二叉树的性质 完全二叉树的性质 三.二叉树的储存结构 顺序储存 链式存储 四.树的储存方式 双亲表示法 ...

  5. 数据结构与索引-- B+树索引

    B+树索引 上一节中我们讨论的都是B+树的数据结构的由来以及他的一些操作,B+树索引在本质就是B+树在数据库中的一个实现,但是B+索引在数据库中有一个特点就是他的高扇出性,因此在数据库中,B+树的高度 ...

  6. 数据结构与算法--B树原理及实现

    B树 前几篇文中讨论的数据结构我们都是假设所有的数据都存储在计算机的主存中.可说总要那么海量的数据需要通过个中数据结构去存储,我们不可能有这么多内存区存放这些数据.那么意味着我们需要将他们放磁盘.所以 ...

  7. (王道408考研数据结构)第五章树-第四节2:平衡二叉树(AVL)及其旋转

    文章目录 一:AVL树基本概念 二:AVL树实现原理 (1)构建AVL树 (2)构建演示 (3)旋转方法 A:右单旋转调整(插入到较高左子树左侧) B:左单旋转调整(插入到较高右子树右侧) C:先左后 ...

  8. 《大话数据结构》读书笔记-树

    写在前面:本文仅供个人学习使用.<大话数据结构>通俗易懂,适合整体做笔记输出,构建体系.并且文中很多图片来源于该书,如有侵权,请联系删除. 文章目录 6.2 树的定义 6.2.1 结点分类 ...

  9. 【数据结构——哈夫曼树及其应用】

    [数据结构--哈夫曼树及其应用] 一.哈夫曼树的基本概念 二.哈夫曼树的构造算法 (一)哈夫曼树的构造过程 (二)哈夫曼树构造算法的实现 1.初始化 2.创建树 3.完整的创建哈夫曼树代码 三.哈夫曼 ...

  10. c++数据结构小助手 : 可视化树与图工具

    c++数据结构小助手 : 可视化树与图工具 基于 graphics.h: 从文件 graph.txt 读图 格式如下: 命名:graph.txt 第一行,两个整数,n个点和m条边,边全都是有向边 第二 ...

最新文章

  1. PC机键盘的处理过程
  2. 逆向工程核心原理学习笔记(五):实战“打补丁方法”修改字符串
  3. RHEL6 让 root可以登录桌面
  4. python中的引用怎么理解_Python函数通过引用调用
  5. 【OpenCV】OpenCV函数精讲之 -- 访问图像中的像素--计时函数
  6. GCC的__attribute__ ((constructor))和__attribute__ ((destructor))
  7. 最新县及县以上行政区划代码(截止2008年12月31日)
  8. 提取数据_R提取全球气象数据
  9. 聊天工具机器人开发_聊天机器人-精致的交流工具? 还是您的客户服务团队不可或缺的成员?...
  10. WPF 一个简单的颜色选择器
  11. 35KV变电站及10KV供配电系统倒闸操作屏QY-PGD09
  12. 体检管理软件#一站式体检管理系统#体检管理软件#体检软件#体检系统#体检管理系统源码
  13. Function的用法
  14. 一峰说:SpringCloud的基础了解和使用
  15. 八部众---走出软件作坊:三五个人十来条枪 如何成为开发正规军(二十三)
  16. 十天教会你做“刀塔传奇”
  17. English # 英语学习第一天(audience)
  18. 冰点文库最新版3210
  19. SpringBoot Poi导出word,浏览器下载
  20. java项目-第61期基于ssm项目在线心理测评系统

热门文章

  1. H5互动小游戏微信营销 | 你离成功只差一个互动游戏的距离
  2. 回归分析—汽车价格预测任务
  3. ElasticSearch教程——基于term vector深入探查数据的情况
  4. 11.15luffycity(7)
  5. ZIP压缩文件如何加密?忘记密码怎么办?
  6. Photoshop中的线性减淡
  7. 深度分析《星际争霸2》
  8. td内容超出 以…显示
  9. beta distribution (beta分布)
  10. cocos2dx实例开发之经典坦克