前言
本文整合平衡二叉树、红黑树、234树、哈夫曼树、B树、B+树、栈与队列核心考点,结合原理图拆解底层逻辑、特性、适用场景与时间复杂度,兼顾面试笔试高频考点,适合计算机基础复习、后端开发面试突击。
一、平衡二叉树![]()
1. 核心特性
- 时间复杂度:增/删/查均为 $O(logn)$
- 优缺点:查询性能稳定高效,但插入、删除操作开销大、耗性能
- 适用场景:读多写少场景(查询频繁、新增删除操作很少)
2. 局限
平衡二叉树维持平衡需要频繁旋转,海量数据高频增删场景性能衰减严重,衍生出红黑树做折中优化。
二、234树与红黑树(红黑树本质是四阶234树)
1. 234树节点定义
234树是多路平衡查找树,节点分三类,所有叶子节点在同一层,树完全平衡:
- 二节点(黑色节点)结构:
next | value | next,1个值、2个子节点,对应红黑树纯黑节点。 - 三节点(黑+红组合)结构:
next value next value next,2个值、3个子节点;上层黑色、下层红色,对应红黑树一黑一红父子节点。 - 四节点(黑+双红组合)结构:
next value next value next value next,3个值、4个子节点,根黑、两个子节点红色。
2. 234树核心规则
- 节点内value全局有序,从小到大排列;
- 整棵树自下而上构建,所有叶子节点深度完全一致;
- 最长路径长度 ≤ 最短路径长度 × 2,保证树不会严重失衡。
3. 红黑树五大铁则(234树映射而来)
- 叶子节点(NULL空节点)永远是黑色;
- 根节点一定是黑色;
- 红色节点的子节点只能是黑色(不能红连红);
- 从任意节点到其所有叶子节点,路径上黑色节点数量相等(黑高统一);
- 路径极值:
- 最短路径:全黑节点(黑→黑→黑→叶子)
- 最长路径:黑红交替(黑→红→黑→红→叶子) 最长路径长度不会超过最短路径2倍,天然保证 $O(logn)$ 时间复杂度。
4. 红黑树优势
对比平衡二叉树,红黑树牺牲极致平衡,减少旋转次数,增删性能大幅提升;JavaTreeMap、C++map、Linux内核进程调度均使用红黑树。
三、哈夫曼树 & 哈夫曼编码(数据压缩核心)
1. 基础概念定义
- 节点权:节点存储的数值(字符出现频次);
- 路径:从根到节点经过的边;
- 路径长度:路径上边的数量;
- 带权路径长度:节点权值 × 自身路径长度;
- 树WPL(带权路径总长):所有叶子节点带权路径长度相加;
- 哈夫曼树:WPL最小的二叉树,最优二叉树。
2. 哈夫曼编码原理(解决数据压缩)
- 传统ASCII定长编码:每个字符固定8bit存储,不管字符出现次数,空间浪费严重;
- 哈夫曼变长编码:字符出现频次越高,对应编码二进制位数越短;低频字符编码更长,整体压缩存储空间;
- 编码规则:构建哈夫曼树时,左分支统一记
0,右分支统一记1,从根走到叶子拼接二进制即为字符编码。
3. 实战场景:文本传输i like bananas
原始ASCII传输每个字符占8bit,数据量大; 统计每个字母出现频次构建哈夫曼树,高频字母用短二进制,网络传输时大幅减少报文长度,广泛应用在文件压缩、通讯编码领域。
4. 构建规则
每次选取权值最小的两个节点合并生成父节点(父节点权=两子节点权之和),循环合并直到只剩根节点。
四、栈与队列(线性基础结构)
1. 栈 Stack
- 核心规则:先进后出(LIFO)
- 操作性能:入栈、出栈操作时间复杂度 $O(1)$
- 常见场景:函数调用栈、表达式求值、括号匹配、深度优先遍历DFS
2. 队列 Queue
- 核心规则:先进先出(FIFO)
- 操作性能:入队、出队操作时间复杂度 $O(1)$
- 常见场景:消息队列、任务调度、广度优先遍历BFS、缓冲池
五、多叉树衍生:B树 & B+树(磁盘数据库索引底层)
1. K阶B树基础定义
B树是多路平衡查找树,专为磁盘IO优化设计(磁盘读写速度远慢于内存,减少IO次数是核心目标):
- K阶B树:单个节点最多拥有K个分叉;
- 节点存储规则:单个节点最多存储
K-1组key-value; - 节点内key全局升序排列;
- key代表索引编号,value对应磁盘页号,通过页号直接读取磁盘数据。
2. B树结构特点
- 所有数据索引分散在整棵树全部节点(根、中间、叶子都存key+数据页);
- 所有叶子节点处于同一层级,查询稳定 $O(logn)$;
- 适合磁盘随机查询场景。
3. B+树(MySQL InnoDB索引默认结构,优化版B树)
- 非叶子节点仅存储索引key,不存真实数据页,单个节点可存放更多索引,树高度更低,磁盘IO次数更少;
- 全部真实数据只存在叶子节点;
- 叶子节点通过双向链表串联,范围查询、分页遍历性能碾压B树;
- 数据库绝大多数场景(模糊查询、区间检索、全表扫描)优先使用B+树。
4. 磁盘底层交互逻辑
磁盘读写存在机械寻道耗时(单次读取5~6ms),CPU内存读取仅0.2ms;B/B+树通过阶数放大单节点索引数量,降低树高度,最大限度减少磁盘IO,是数据库索引最优解。
六、基础排序补充:冒泡排序
- 时间复杂度:最坏/平均 $O(n^2)$,最优 $O(n)$(有序数组)
- Java工具类:
Arrays.sort()底层会根据数据规模自动切换插入排序、快速排序、归并排序,不会单纯使用冒泡排序。
七、各结构选型总结(面试必背)
| 数据结构 | 时间复杂度 | 适用场景 |
|---|---|---|
| 平衡二叉树 | $O(logn)$ 读写 | 读极多、极少增删,内存索引 |
| 红黑树 | $O(logn)$ 读写 | 内存有序容器(TreeMap),读写均衡 |
| 哈夫曼树 | 构建$O(nlogn)$ | 文件压缩、通讯变长编码 |
| B树 | $O(logn)$ | 磁盘单条随机检索 |
| B+树 | $O(logn)$ | 数据库索引、区间范围查询 |
| 栈 | $O(1)$ 操作 | 递归、表达式运算 |
| 队列 | $O(1)$ 操作 | 任务异步调度、广度遍历 |
八、文末总结
本文覆盖计算机笔试面试高频树形结构与线性结构,理清234树和红黑树的等价关系、哈夫曼树压缩本质、B/B+树磁盘优化核心逻辑。树形结构核心目标都是将查询复杂度压缩至 $O(logn)$,只是针对内存、磁盘、压缩等不同场景做针对性优化。