阿里云做网站需要环境,免费自助建站快速自助建站,满洲里网站建设,绍兴做网站创作不易#xff0c;兄弟们来波三连吧#xff01;#xff01;
一、树的概念及结构
1.1 树的概念 树是一种非线性的数据结构#xff0c;它是由n#xff08;n0#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树#xff0c… 创作不易兄弟们来波三连吧
一、树的概念及结构
1.1 树的概念 树是一种非线性的数据结构它是由nn0个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树也就是说它是根朝上而叶朝下的。 1、有一个特殊的结点称为根结点根节点没有前驱结点 2、除根节点外其余结点被分成M(M0)个互不相交的集合T1、T2、……、Tm其中每一个集合Ti(1 i m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱可以有0个或多个后继每个孩子只能有一个父亲每个父亲可以有多个孩子 3、因此树是递归定义的。树可以分成2部分1部分是父亲节点1部分是N颗子树如果子树不是叶子那么子树可以继续分成父节点和子树
注意树结构中子树之间不能有交集否则就不是树结构 1.2 树的相关名词
树的相关名词是依照树加上人类的亲缘关系表述的 节点的度一个节点含有的子树的个数称为该节点的度 如上图A的为6叶节点或终端节点度为0的节点称为叶节点 如上图B、C、H、I...等节点为叶节点非终端节点或分支节点度不为0的节点 如上图D、E、F、G...等节点为分支节点双亲节点或父节点若一个节点含有子节点则这个节点称为其子节点的父节点 如上图A是B的父节点孩子节点或子节点一个节点含有的子树的根节点称为该节点的子节点 如上图B是A的孩子节点兄弟节点具有相同父节点的节点互称为兄弟节点 如上图B、C是兄弟节点树的度一棵树中最大的节点的度称为树的度 如上图树的度为6节点的层次从根开始定义起根为第1层根的子节点为第2层以此类推树的高度或深度树中节点的最大层次 如上图树的高度为4堂兄弟节点双亲在同一层的节点互为堂兄弟如上图H、I互为兄弟节点节点的祖先从根到该节点所经分支上的所有节点如上图A是所有节点的祖先子孙以某节点为根的子树中任一节点都称为该节点的子孙。如上图所有节点都是A的子孙森林由mm0棵互不相交的树的集合称为森林
以上标红的是博主认为比较重要的。
1.3 树的表示方法 树的结构相比较于以往的其他结构就比较复杂了要存储起来表示就比较有难度不仅要保存值域也要保存节点和节点之间的关系。
如果我们知道节点的度那么我们就可以根据这个度来决定我们的结构体中需要有多少个孩子指针但是如果我们不知道节点的度我们就有了以下方法来表示
1.3.1 双亲表示法 实现定义数组结构存放树的结点每个结点含两个域 数据域存放结点本身数据信息。 双亲域指示本结点的双亲结点在数组中的位置。可以存放双亲的下标也可以存放双亲的指针 这样的存储结构根据结点parent指针很容易找到它的双亲结点所用时间复杂度为O(1)直到parent为-1时找到了树的根结点但是如果我们想要知道孩子的节点那么唯一的方法就是遍历 特点找双亲容易找孩子难
1.3.2 孩子表示法 具体办法是把每个结点的孩子结点排列起来看成是一个线性表以单链表作存储结构则n个结点有n个孩子链表叶子结点的孩子链表为空然后n个头指针又组成一个线性表采用顺序存储结构存放进一个一维数组中 特点找孩子易找双亲难 这样的结构对于我们要查找某个结点的某个孩子或者找某个结点的兄弟只需要查找这个结点的孩子单链表即可。对于遍历整棵树也是很方便的对头结点的数组循环即可。
1.3.3 孩子双亲表示法
就是把上面两种方法结合一下 即在链表表头再增加一个数据域存储双亲的下标用空间换取方便
1.3.4 左孩子右兄弟表示法
但是我们用的最多的还是左孩子右兄弟法因为相关的结构体只需要1个指向兄弟的指针1个指向第一个孩子的指针一个数据域就可以解决问题了
typedef int DataType;
struct Node
{
struct Node* _firstChild1; // 第一个孩子结点
struct Node* _pNextBrother; // 指向其下一个兄弟结点
DataType _data; // 结点中的数据域
}; 1.4 树在实际中的应用
就是文件系统中的目录树结构 我们打开磁盘在底层就是通过磁盘地孩子指针找到第一个孩子然后再通过第一个孩子的兄弟指针开始逐个逐个遍历后面的兄弟节点才能把整个目录给列举出来 如果我们新建一个文件夹就是让该文件目录下的兄弟节点指向NULL的文件指向这个新建文件然后新建文件的兄弟指针指向NULL当然这个也要看情况有时候文件排序的方式也是不同的
二、二叉树的概念及结构 实际中我们的树一般只用在这个目录树结构而我们最常用的是树中的一个比较特殊的群体——二叉树
2.1 二叉树的概念
一棵二叉树是结点的一个有限集合该集合: 1. 或者为空 2. 由一个根节点加上两棵别称为左子树和右子树的二叉树组成 二叉树的特点
1、 二叉树不存在度大于2的节点
2、二叉树的左右子树不能颠倒
2.2 特殊的二叉树 1. 满二叉树一个二叉树如果每一个层的结点数都达到最大值则这个二叉树就是满二叉树。也就是 说如果一个二叉树的层数为K且结点总数是 则它就是满二叉树。2. 完全二叉树完全二叉树是效率很高的数据结构完全二叉树是由满二叉树而引出来的。对于深度为K的有n个结点的二叉树当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。
2.3 二叉树的性质
1. 若规定根节点的层数为1则一棵非空二叉树的第i层上最多有2^(i-1)个结点.
2. 若规定根节点的层数为1则深度为h的二叉树的最大结点数是2^h-1
3. 对任何一棵二叉树, 如果度为0其叶结点个数为n0, 度为2的分支结点个数为n2 ,则有总是有n0n21
4. 若规定根节点的层数为1具有n个结点的满二叉树的深度hlogN1(ps 是log以2 为底n1为对数) 5. 对于具有n个结点的完全二叉树如果按照从上至下从左至右的数组顺序对所有节点从0开始编号则对于序号为i的结点有 1. 若i0i位置节点的双亲序号(i-1)/2i0i为根节点编号无双亲节点 2. 若2i1n左孩子序号2i12i1n否则无左孩子 3. 若2i2n右孩子序号2i22i2n否则无右孩子
2.4 二叉树的存储方式
2.4.1 顺序存储 顺序结构存储就是使用数组来存储一般使用数组只适合表示完全二叉树因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储关于堆我们后面的章节会专门讲解。二叉树顺序存储在物理上是一个数组在逻辑上是一颗二叉树。
一般来说顺序存储只适用于完全二叉树
2.4.2 链式存储 二叉树的链式存储结构是指用链表来表示一棵二叉树即用链来指示元素的逻辑关系。 通常的方法是链表中每个结点由三个域组成数据域和左右指针域左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。链式结构又分为二叉链和三叉链。
先介绍到这里了
关于存储方式的详细介绍后面会发布文章进行学习的
感谢支持