微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

第五章 树

第五章 树

5.1 树的基本概念

树的定义

树是n个节点的有限集合,当n=0的时候为空树。在一棵树中应该满足:

  1. 有且仅有一个特定的称为的节点
  2. 当n>1的时候,其余几个点可分为m个互不相交的有限集合,其中每一个集合又是一棵树,这就是根的子树

显然,树的定义是递归的,树作为一种逻辑结构同时也是一种分层结构,具有两个特点:

  1. 树的根节点没有钱去,除根节点之外的所有节点只有一个前驱
  2. 树中所有节点可以有0个或者多个后继

基本术语

  1. 根到节点K的路径上的节点称为K的祖先,而K是这些节点的子孙。路径上离K最近的节点E称为K的双亲,K是E的孩子。根节点是唯一没有双亲的节点,有相同双亲节点的称为兄弟

  2. 树中一个节点的孩子个数称之为该节点的,树中节点的最大度数称为树的度

  3. 度大于0的节点称为分枝节点;度为0(也就是没有子女节点)的节点称之为叶子节点

  4. 节点的深度:自顶向下逐层累加

    节点的高度:自底向上逐层累加

    节点的层次从树根开始定义,根为第一层,以此类推。

    树的高度\深度就是树中节点的最大层数

  5. 有序树和无序树

  6. 路径和路径长度:路径是从根到该节点经过的节点集合,长度则是经过边的数量

  7. 森林

树的性质

  • 树中的结点数量等于所有节点度数之和加一
  • 度为m的树中的第i层至多有 m i − 1 m^{i-1} mi1个结点
  • 高度为h的m叉树最多有 m h − 1 m − 1 \frac{m^h-1}{m-1} m1mh1个结点(知道高度和树的度求结点)
  • 具有n个结点的m叉树的最小高度为 ⌈ l o g m ( n ( m − 1 ) + 1 ) ⌉ \lceil log_m(n(m-1)+1) \rceil logm(n(m1)+1)⌉(知道树的度和节点数求最小高度)

5.2 二叉树的概念

二叉树的定义及其主要特征

定义

二叉树是另外一种树形结构,其特点是每个节点最多只有两颗子树,并且二叉树的子树有左右之分,并且有序,其次序不能任意颠倒。

特殊的二叉树

二叉树的性质

二叉树存储结构

顺序存储结构

链式存储结构

5.3 二叉树的遍历和线索二叉树

二叉树的遍历

1.先序遍历

  • 访问根节点
  • 先序遍历左子树
  • 先序遍历右子树

2.中序遍历

  • 中序遍历左子树
  • 访问根节点
  • 中序遍历右子树

3.后序遍历

  • 后序遍历左子树
  • 后序遍历右子树
  • 访问根节点

4.层次遍历

层次遍历的意思是按照二叉树的层,从低层逐渐遍历到高层。要进行层次遍历,需要借助一个队列,先将根节点入队,如果他有左、右子树,则分别将他们入队。然后该节点出队

5.由遍历序列构造二叉树

由二叉树的先序序列和中序序列可以唯一的确定一棵二叉树。

由二叉树的后序序列和中序序列可以唯一的确定一棵二叉树。

线索二叉树

(待补充)

5.4 树、森林

树的存储结构

1.双亲表示法

这种存储方式采用一组连续的空间来存储每个节点,同时在每个节点之中增设一个伪指针,指示其双亲节点在数组中的位置。该存储结构利用了每个节点只有唯一双亲的性质,可以快速得到每个节点的双亲节点,但是求孩子节点需要遍历整个结构。

2.孩子表示法

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

3.孩子兄弟表示法

孩子兄弟表示法又称为二叉树表示法。孩子兄弟表示法包括三部分内容:节点之、指针节点第一个孩子节点的指针、指向节点下一个兄弟节点的指针。也就是说,节点的第一个指针用于指向其孩子节点,第二个指针用于指向同一层的其他节点,通常称为“左孩子右兄弟”。这种存储表示法比较灵活,可以通过该方法实现将树转化为二叉树

树、森林与二叉树的转换

二叉树和树都可以采用二叉链表作为存储结构,因此以二叉链表作为媒介可以导出树和二叉树的一个对应关系。有关树和二叉树的转换详见孩子兄弟表示法

将森林转化为二叉树的规则和树类似,先将森林中的每棵树转化为二叉树,由于任何一刻树对应的二叉树右子树必为空,因此将第二棵二叉树视为第一棵树根的右兄弟,以此类推。

树和森林的遍历

树的遍历是用某种方式访问树的每个节点并且只访问一次,主要有两种方式:

  1. 先根遍历:如果树非空,先访问根节点,再依次遍历根节点每棵子树,遍历每棵子树仍遵循先根后子树的规则。
  2. 后根遍历:如果树非空。西安一次遍历根节点的每棵子树,再访问根节点,遍历子树时仍遵循该规则。

森林也有两种遍历方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5tsCSeKJ-1661343911885)(/Users/chuhaoh/Documents/复试/2021王道数据结构/pic/4-3.png)]

树的应用——并查集(不太熟)

并查集的三个基本操作为:

  1. Union(S,root1, root2)
  2. Find(S,x)
  3. Initial(S)

并查集的存储结构是树(森林)的双亲,每个子集用一棵树表示,所有表示子集合的树构成全集合的森林,存放在双亲表示数组内。通常用数组元素的下标带遍元素名,用根节点的下标代表子集合名。

5.5 树与二叉树的应用

二叉排序树(BST)

定义

二叉排序树是有以下特征的二叉树:

  1. 如果左子树非空,则左子树所有节点值均小于根节点的值
  2. 如果右子树非空,则右子树上所有节点的值均大于根节点的值
  3. 左右节点也分别是一棵二叉排序树

根据定义,左子树节点值 < 根节点值 < 右子树节点值

二叉排序树的查找

二叉排序树查找从根节点开始,如果二叉排序树非空,则先用给定值和根节点比较,如果相等则成功;如果不相等则比较:如果小于根节点则在根节点左子树上查找;如果大于根节点则在根节点右子树上查找。

二叉排序树的插入

二叉排序树是一种动态树表,其特点是树的结构会根据插入节点而改变。插入节点的过程如下:如果树为空,则直接插入;否则,如果插入关键字k小于根节点值则插入到左子树;如果关键字k大于根节点值则插入到右子树。插入的节点一定是一个添加的叶节点。

查找效率

若排序树为平衡二叉树,则它的平均查找长度为O(log2n),如果二叉排序树只是一个只有右(左)孩子的单支树,则平均查找长度为O(n)。

平衡二叉树

定义

为了避免树的高度增长过快,降低二叉排序树的性能,规定在插入和删除二叉树节点是,要保证任意节点的左右子树高度差的绝对值不超过1。如果出现了不平衡,则需要通过调整个节点的位置关系使得重新平衡。节点左子树和右子树的高度差称为该节点的平衡因子

插入

平衡二叉树的插入过程前半部分和二叉排序树一样。但是如果插入后出现了不平衡,则需要进行调整,主要分为以下四种情况:

(1)LL平衡旋转(右单旋转):

(2)RR平衡旋转(左单旋转):

(3)LR平衡旋转(先左后右双旋转):

查找

哈夫曼树和哈夫曼编码

在许多应用中,树的某一个节点会被赋予一个权重,称为该节点的,从树的根到任意节点的路径长度与该节点上的权的积,称之为该节点的带权路径长度

哈夫曼树

在含有n个带权也节点的二叉树中,其中带权路径长度之和最小的二叉树称为哈夫曼树,又称为最优二叉树

哈夫曼树的构造

算法描述:

  1. 将n个节点分别作为n棵仅有一个节点的二叉树构造出森林F
  2. 构造一个新节点,选择F中根节点权重最小的两棵树作为它的左右子树,并且将新节点的权值置为左右两棵子树的根节点的权值之和
  3. 从F中删除两棵子树,并且将新得到的树加入F中
  4. 重复2、3步直到F中只有一棵树

哈夫曼树的构造具有以下特点

  • 每个初始节点都最终成为叶节点,而且权值越小的节点到根节点的路径长度越大
  • 构造中新建了n-1个节点,因此哈夫曼树的节点总数为2n-1
  • 每次构构造选择2棵树作为新节点的孩子节点,因此哈夫曼树不存在度为1的节点

哈夫曼编码

哈夫曼编码可以将每一个出现的字符当作是一个独立的几诶单,其权值为它出现的频度,构造出的哈夫曼树可以压缩二进制编码的长度。

原文地址:https://www.jb51.cc/wenti/3280832.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐