持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情
大话数据结构
一、数据结构绪论
逻辑结构:
- 集合结构
- 线性结构
线性结构中的数据元素是一对一的关系 - 树形结构
存在一对多的层次关系 - 图形结构
存在多对多的层次关系
物理结构:
- 顺序存储结构
- 链接存储结构
树
度:n 节点拥有的子树数
深度:从根到 n 节点的唯一路径的长。根的深度为 0
高度:n 结点到树叶的最长路径
遍历:分为先序遍历、中序遍历、后序遍历
先序遍历:节点的处理是在他的儿子节点处理之前被处理。
中序遍历:先递归左子树,在计算根节点,在递归右子树。
二叉树
- 每个节点最多拥有两个子树
- 左子树和右子树是有顺序的,不能随意颠倒
- 即使树中某个节点只有一个子树,也要区分左右
以下都是二叉树:
二叉查找树
性质:对于树中的每个节点 X,他的左子树所有项的值小于 X 中的项。
特殊二叉树
- 斜树
只存在左子树或右子树 - 满二叉树
非叶子节点的度一定是 2,叶子节点只出现在最下一层 - 完全二叉树
对一个有 n 个节点的二叉树按层序编号,如果编号为 i 的节点与同样深度的满二叉树中编号为 i 的节点在二叉树中位置相同,那么这棵树就是完全二叉树。
赫夫曼树
从树中一个结点到另一个结点的分支数目,叫做路径长度。
带权路径长度最小的二叉树就是赫夫曼树
当时赫夫曼发明赫夫曼树是为了解决电报传输问题。
怎么解决:
如果每个字母都用一样长度的二进制字符表示,那一段话翻译过来是很长的。只有将频率高的字符用短的二进制码表示,频率低的字符用长的二进制码表示才行。那么怎么安排呢?就可以用上赫夫曼树了。
我们对这 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
- 所有叶子结点都在同一层
B+树
是一种应文件系统所需出的一种 B 树的变形树。B 树中,每一个元素只出现一次,但是 B+树中,出现在分支结点中的元素会在叶子结点中再次出现,另外,每一个叶子结点都有一个指向后一个叶子节点的指针。
一个 m 阶的 B+树特点如下:
- 有 n 棵子树的非叶子结点中含有 n 个关键字(b 树是 n-1 个),这些关键字不保存数据,只用来索引,所有数据都保存在叶子节点(b 树是每个关键字都保存数据)。
- 所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
- 所有的非叶子结点可以看成是索引部分,结点中仅含其子树中的最大(或最小)关键字。
- 通常在 b+树上有两个头指针,一个指向根结点,一个指向关键字最小的叶子结点。
B+树相比于 B 树的查询优势:
- B+树中间节点不保存数据,所以一个磁盘页能容纳更多的结点元素。
- B+树查找必须找到叶子节点,B 树只要匹配到即可,因此 B+树更稳定
- 对于范围查找来说,B+树只需遍历叶子节点即可,而 B 树需要重复的中序遍历