点击上面蓝字关注我们

树、森林

  • 1. 树的存储结构

    • 1.1 双亲表示法

    • 1.2 孩子表示法

    • 1.3 孩子兄弟表示法

  • 2. 树、 森林与二叉树的转换

  • 3. 树和森 林的遍历

  • 4. *书的应用-并查集

1. 树的存储结构

树的存储方式有多种,即可采用顺序存储结构,又可采用链式存储结构。无论哪种方式都要反映出树中各结点之间的逻辑关系,下面介绍3种常用的存储结构

1.1 双亲表示法

这种存储方式采用哟组连续空间来存储每个结点,同时在每个结点种增设一个伪指针,指示其双亲结点在数组中的位置。

双亲表示法的存储结构描述 内联代码片

#define MAX_TREE-SIZE 100//树中最多结点数typedef struct       //树的结点定义{  ElemType data;     //数据元素  int parent;       //双亲位置域}PTNode;typedef struct       //树的类型定义{  PTNode nodes[MAX_TREE_SIZE];//双亲表示  int n;         //结点树}PTree;

该存储结构利用了每个结点(根结点除外)只有唯一双亲的性质,可以很快得到每个结点的双亲结点,但求结点的孩子时需要遍历整个结构。

1.2 孩子表示法

孩子表示法是将每个结点的孩子结点都用单链表链接起来形成一个线性结构,此时n个结点就有n个孩子链表(叶子结点的孩子链表为空表)如下图
这种存储方式寻找子女的操作非常直接,而寻找双亲的操作需要遍历n个结点中孩子链表指针域所指向的n个孩子链表.

1.3 孩子兄弟表示法

孩子兄弟表示法又称二叉树表示法,即以二叉树表作为树的存储结构孩子兄弟表示法使每个结点包括三部分内容:结点值、指向结点第一个孩子结点的指针,及指向结点下一个兄弟结点的指针。
孩子兄弟表示法的存储结构描述如下 内联代码片

typedef struct CSNode{  ElemType data;//数据域  struct CSNode *f_child, *n_sibling;//第一个孩子和右兄弟指针}CSNode ,*CSTree;

2. 树、 森林与二叉树的转换

由于二叉树和树都可以用二叉链表作为存储结构,因此以一叉链表作为媒介可以导出树与二叉树的一个对应关系,即给定一棵树, 可以找到唯一的一 棵二叉树与之对应。从物理结构上看,它们的二叉链表是相同的,只是解释不同而已。
树转换为二叉树的规则:每个结点左指针指向它的第一个孩子, 右指针指向它在树中的相邻右兄弟,这个规则又称“左孩子右兄弟”。由于根结点没有兄弟,所以对应的二又树没有右子树
树转换成:又树的画法:①在兄弟结点之间加连线: ②对每个结点。只保留它与第一个孩子的连线,而与其他孩子的连线全部抹掉:③以树根为轴心顺时针发转45℃。
森林转换成二又树的画法:①将森林中的每棵树转换成相应的二叉树:②每棵树的根也可视为兄弟关系,在每棵树的根之间加一根连线: ③以第一棵树的根 为轴心顺时针旋转45°。
二又树转换为森林的规则:若二叉树非空,则二叉树的根及其左子树为第一棵树的 二叉树形式,故将根的右链断开。二叉树根的右子树又可视为一一个由除第一 棵树 外的森林转换后的二叉树,应用同样的方法,直到最后只剩棵没有右子树的二 叉树为止,最后再将每棵二叉树依次转换成
树,就得到了原森林。

3. 树和森 林的遍历

树的遍历是指用某种方式访问树中的每个结点,且仅访问次。主要有两种 方式:
1)先根遍历。若树非空,先访问根结点,再依次遍历根结点的每棵子树,遍历子树时仍遵循先根后子树的规则。其遍历序列与这棵树相应二叉树的先序序列相同。
2)后根遍历。若树非空,先依次遍历根结点的每棵子树,再访问根结点, 遍历子树时仍遵循先子树后根的规则。其遍历序列与这棵树相应二叉树的中序序列相同。
按照森林和树相互递归的定义,可得到森林的两种遍历方法。
1)先序遍历森林。若森林为非空,则按如下规则进行遍历:
●访问森林中第一棵树 的根结点。
●先序遍历第一 棵树中根结点的子树森林。
●先序遍历除去第一棵树之后剩余的树构成的森林。
2)中序遍历森林。森林为非空时,按如下规则进行遍历:
●中序遍历森林中第一 棵树的根结点的子树森林。
●访问第棵树的根结点。
●中序遍历除去第一 棵树之后剩余的树构成的森林。

4. *书的应用-并查集

注:
在采用树的双亲指针数组表示作为并查集的存储表示时,集合元素的编号从0到size-1。其中size是最大无素的个数。下面是并查集主要运算的实现。并查集的结构定义如下:

#define SIZE 100intUFSets [SIZE] ;//集合元素数组(双亲指针数组)

并查集的初始化操作(s即为并查集):

void Initiallint S[]) {for(int i=0;i<size;i++)//每个自成单元素集合S[i]=-1;}

Find操作(函数在并查集S中查找并返回包含元素x的树的根):

int Find(int s[],int x) {while(S[x]>=0)//循环寻找x的根     x=S[x] ;return x;//根的S[]小于0}

Union操作(函数求两个不相交子集合的并集):

void Union(int S[],int Root1,int Root2) {//要求Root1与Root2是不同的,且表示子集合的名字S[Root2]=Root1;//将根Root2连接到另根Root1 下面}

应用后续更新:欢迎微信扫码“MeiXiangDao2020”
领取资料

End

1

发现更多精彩

关注公众号

留言板

中根遍历二叉查找树所得序列一定是有序序列_数据结构考研学习笔记(九)树、森林...相关推荐

  1. 中根遍历二叉查找树所得序列一定是有序序列_二叉搜索树(BST)

    点击上方"蓝字",发现更多精彩. 前面我们介绍了树的基本概念,并引出了二叉树.值得注意的是,无特征的二叉树在工程上几乎没啥用处,一般都是使用bst.avl,trie,rbtree等 ...

  2. 中根遍历二叉查找树所得序列一定是有序序列_学习数据结构--第六章:查找(查找)

    第六章:查找 1.查找的基本概念 查找:在数据集合中寻找满足某种条件的数据元素的过程. 查找的结果 查找成功和查找失败 查找表:用于查找的数据集合,由同一种数据类型(或记录)的组成,可以是一个数组或链 ...

  3. python中列表、元组、字符串都属于有序序列_列表、元组、字符串是Python的有序序列。...

    列表.元组.字符串是Python的有序序列. 答:√ 根据<劳动合同法>第五十八条的规定,劳务派遣单位应当与被派遣劳动者订立( ). 答:二年以上的固定期限劳动合同 理性的基础是(). 答 ...

  4. java中根遍历后根遍历构造,恳求大佬指点!!!首先标明空子树的先根遍历序列建立一棵二叉树...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 回复 甜味_猫 : public class BiTree { private BiTreeNode root; public BiTree(String ...

  5. 表达式树 php,Linux_LINQ学习笔记:表达式树,构建查询表达式 本节中, 我们 - phpStudy...

    构建查询表达式 本节中, 我们假设我们拥有一个这样的实体类: 1: [Table] public partial class Product 2: 3: { 4: 5: [Column(IsPrima ...

  6. python序列类型唯一的映射类型_python2.x学习笔记(8)-映射和集合类型

    1. 字典是 Python 语言中唯一的映射类型.映射类型对象里哈希值(键) 和指向的对象(值)是一对一的关系. 2. 一个字典对象是可变的,它是一个容器类型,能存储任意个数的 Python 对象,其 ...

  7. Android中Http网络请求库框架Volley和Asnyc-http的使用---第三方库学习笔记(一)

    Volley框架: 特点: 通信更快,更简单 Get,Post网络请求及网络图像的高效率异步处理请求. 当多个请求时,对网络请求进行排序,按优先级处理 当网络状况不好时,Volley可以自动对上次请求 ...

  8. java中的多态与继承_【Java学习笔记之十六】浅谈Java中的继承与多态

    1.  什么是继承,继承的特点? 子类继承父类的特征和行为,使得子类具有父类的各种属性和方法.或子类从父类继承方法,使得子类具有父类相同的行为. 特点:在继承关系中,父类更通用.子类更具体.父类具有更 ...

  9. python如何调用参数配置文件_【Python学习笔记七】从配置文件中读取参数

    将一些需要经常更改的参数存放在配置文件中,通过读取配置文件来获取参数,这样修改以及使用起来比较方便 1.首先是配置文件的写法,如下一个environment.ini文件: a:里面"[]&q ...

最新文章

  1. 干货|利用卷积自编码器对图片进行降噪
  2. 一步一步搞定InfoPath(02)--配置VSTA
  3. Excel异常Cannot get a text value from a numeric cell
  4. Session的配置
  5. Java.math.BigDecimal
  6. ssl1746-商务旅行【tarjan,LCA】
  7. Linux下scp命令的用法
  8. 【文末送书】调参太费力?自动化机器学习来帮你!
  9. 华为负一屏Java_干货分享:华为手机负一屏使用设置方法详解,不会的赶紧了解一下...
  10. mysql8019zip安装_Eclipse+java+mysql8019实现数据库连接
  11. 网络重置有多难搞!!win10网络重置后怎么解决
  12. 移动Web UI组件库汇总
  13. JS格式化数字保留小数点
  14. Editor\Data\il2cpp/build/deploy/net471/il2cpp.exe did not run properly!
  15. iphone文件服务器权限,苹果手机怎么开启文件共享权限
  16. 计算机网络学习——套接字实验(二)
  17. B2B2C 商城系统 WSTMart_v2.0.6_180726程序发布
  18. 不等距双杆模型_对磁场中双杆模型问题的解析(精)
  19. vscode如何同时运行多个vue项目
  20. 一句shell命令搞定代码行数统计

热门文章

  1. 【elasticsearch】 document 查询原理
  2. 【Kafka】kafka消费组查看lag
  3. hadoop的ACL权限
  4. 【Sentry】为什么Cloudera要创建Hadoop安全组件Sentry?
  5. python删除部分字符串_如何删除python列表中的部分字符串?
  6. SpringCloud项目:实现推送消息到RabbitMQ消息中间件
  7. 某厂面试归来,发现自己落伍了!
  8. Mybatis中的延迟加载的使用方法
  9. 微信小程序四(设置底部导航)
  10. TTL电平与CMOS电平