树
树的定义
树是一种重要的数据结构,广泛应用于计算机科学中。根据不同的需求和应用场景,树可以分为多种类型:
- 普通树:每个节点包含数据域、第一个孩子和下一个兄弟。
- 二叉树:每个节点包含数据域、左子树和右子树。
- 满二叉树:一个满二叉树的节点数为 (2^n - 1)。
- 完全二叉树:所有层都完全填满,除了最后一层,节点从左到右依次排列(如堆、优先级队列)。
- 二叉搜索树:左子树的所有节点值小于根节点值,右子树的所有节点值大于根节点值。
平衡二叉搜索树
平衡二叉搜索树是一种特殊的二叉搜索树,其特点是任意两个叶子节点的深度差不大于1。常见的平衡二叉搜索树有:
- AVL 树
- 红黑树(通常用于实现二叉搜索树)
- 树堆
AVL树
AVL树是一种严格平衡的二叉搜索树,通过旋转操作来保持平衡。常见的不平衡情况及其解决方法如下:
- 左左(LL):右旋(顺时针旋转)
- 左右(LR):先左旋再右旋
- 右右(RR):左旋(逆时针旋转)
- 右左(RL):先右旋再左旋
红黑树
红黑树是一种平衡二叉搜索树,具有以下五个属性:
- 对所有节点着色,红或黑。
- 根节点为黑色。
- 叶子节点为黑色的空节点。
- 红色节点的左右孩子节点为黑色(不能出现连续的红色)。
- 任意一条路径中黑色节点数量相同。
哈夫曼树
哈夫曼树是一种用于文本数据编码和压缩的算法。其编码方式如下:
-
定长编码:
-
ANSI:1 byte(8 bit)
-
GB2312:2 byte(16 bit)
-
变长编码:
-
UTF-8:
-
字母数字:1 byte
-
中文汉字:3 byte
例子
例子
B 树和 B+ 树
MySQL表查询基于 B+ 树实现。
B 树
B 树是一种平衡多路查找树,一个节点可以存储多个键值(索引值),若是n个键,则子树为 n + 1 个分支。
- 优点:可以大幅降低树的深度,在进行各种操作时在磁盘访问节点的次数降低。
- 缺点:在每个节点的比较次数增加了。
在磁盘上进行各种操作,推荐使用B(B+)树而非二叉搜索树。
构建过程比较:
- 二叉搜索树:自上而下
- B 树:自下而上
B+ 树
B+ 树是B树的增强版,与B树不同的是同层节点间有指针连接。
- MySQL InnoDB 引擎:使用B+树。
- MyISAM、Memory:使用B树。
B | B+ | |
---|---|---|
数据 | 所有节点 | 叶子节点 |
叶子节点 | 双向链表 | |
访问 | 随机 | 按照范围访问 |
哈希表
哈希表是一种基于数组定义的散列表。哈希表不允许放满,装载因子一般为70%左右,存入数据达到容量的装载因子数后,需要扩容。
哈希函数
- md5
- sha1
- sha256
数据的键 -> 整数
整数 % 数组大小 = 0 ~ len - 1
哈希冲突
哈希函数值相同会导致哈希冲突。
冲突解决方法
- 线性探测:n + 1
- 平方探测:2^n, 1, 2, 4, 8…
- 二次哈希
- 分离链表(*):链表大于8,转成二叉搜索树
哈希表实现
Redis数据库
Redis数据库的本质就是一个哈希表,使用键值对,时间复杂度为常数级O(1)。