大话数据结构之“树”

716 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情

大话数据结构

一、数据结构绪论

逻辑结构:

  • 集合结构
  • 线性结构
    线性结构中的数据元素是一对一的关系
  • 树形结构
    存在一对多的层次关系
  • 图形结构
    存在多对多的层次关系

物理结构:

  • 顺序存储结构
  • 链接存储结构

:n 节点拥有的子树数

深度:从根到 n 节点的唯一路径的长。根的深度为 0

高度:n 结点到树叶的最长路径

遍历:分为先序遍历、中序遍历、后序遍历

先序遍历:节点的处理是在他的儿子节点处理之前被处理。

中序遍历:先递归左子树,在计算根节点,在递归右子树。

二叉树

  • 每个节点最多拥有两个子树
  • 左子树和右子树是有顺序的,不能随意颠倒
  • 即使树中某个节点只有一个子树,也要区分左右

以下都是二叉树:

微信截图_20200102151011.png

二叉查找树

性质:对于树中的每个节点 X,他的左子树所有项的值小于 X 中的项。

特殊二叉树

  • 斜树
    只存在左子树或右子树
  • 满二叉树
    非叶子节点的度一定是 2,叶子节点只出现在最下一层
  • 完全二叉树
    对一个有 n 个节点的二叉树按层序编号,如果编号为 i 的节点与同样深度的满二叉树中编号为 i 的节点在二叉树中位置相同,那么这棵树就是完全二叉树。

赫夫曼树

从树中一个结点到另一个结点的分支数目,叫做路径长度。

带权路径长度最小的二叉树就是赫夫曼树

微信截图_20200102153003.png

当时赫夫曼发明赫夫曼树是为了解决电报传输问题。

怎么解决:

如果每个字母都用一样长度的二进制字符表示,那一段话翻译过来是很长的。只有将频率高的字符用短的二进制码表示,频率低的字符用长的二进制码表示才行。那么怎么安排呢?就可以用上赫夫曼树了。

微信截图_20200102155313.png

我们对这 6 个字母用从根到叶子节点所经过路径的 0 或 1 表示,那么 A 就是 01,E 是 11,F 是 1000,就实现了出现频率高的字母字符短。

平衡二叉树

是一种二叉排序树,每一个节点的左子树和右子树高度差至多为 1. 我们将左子树深度减右子树深度的值称为平衡因子。

多路查找树

其每一个孩子的节点可以多于 2 个,且每一个节点处可以存储多个元素

2-3 树:

其中每一个节点都具有 2 个或 3 个孩子。

B 树:

是一种平衡的多路查找树,结点最大的孩子数目为 B 树的阶。

一个 m 阶的 B 树特点如下:

  • 每个结点最多有 m-1 个关键字
  • 如果根节点不是叶子节点,则至少有 2 个子树
  • 每个非根的分支结点都有 k-1 个元素和 k 个孩子,其中[m/2]<=k<=m
  • 所有叶子结点都在同一层

微信截图_20200103140939.png

B+树

是一种应文件系统所需出的一种 B 树的变形树。B 树中,每一个元素只出现一次,但是 B+树中,出现在分支结点中的元素会在叶子结点中再次出现,另外,每一个叶子结点都有一个指向后一个叶子节点的指针。

一个 m 阶的 B+树特点如下:

  • 有 n 棵子树的非叶子结点中含有 n 个关键字(b 树是 n-1 个),这些关键字不保存数据,只用来索引,所有数据都保存在叶子节点(b 树是每个关键字都保存数据)。
  • 所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
  • 所有的非叶子结点可以看成是索引部分,结点中仅含其子树中的最大(或最小)关键字。
  • 通常在 b+树上有两个头指针,一个指向根结点,一个指向关键字最小的叶子结点。

微信截图_20200102170240.png

B+树相比于 B 树的查询优势:

  • B+树中间节点不保存数据,所以一个磁盘页能容纳更多的结点元素。
  • B+树查找必须找到叶子节点,B 树只要匹配到即可,因此 B+树更稳定
  • 对于范围查找来说,B+树只需遍历叶子节点即可,而 B 树需要重复的中序遍历