一、二叉树的存储结构
1. 顺序存储
- 适用条件:仅适用于完全二叉树或满二叉树,深度为k的二叉树最多有2^k-1个结点
- 存储方式:从上到下、从左往右依次存入连续地址空间,空结点也需保留位置
- 空间效率:非完全二叉树会浪费大量存储空间(如示例中非完全二叉树存储时出现多个空位)
- 特点:通过物理位置表示逻辑关系,不能随意调整结点位置
2. 链式存储
1)二叉链表
- 结点结构:每个结点包含三部分
- 左指针域:存储左孩子地址(无左孩子时为空)
- 数据域:存储结点编号/关键字等实际信息
- 右指针域:存储右孩子地址(无右孩子时为空)
- 优势:相比顺序存储更节约空间,适合普通二叉树
- 局限:无法直接获取双亲结点信息(单向链接)
2)三叉链表
- 结点结构:在二叉链表基础上增加第四部分
- 双亲指针域:存储双亲结点地址(形成双向链接)
- 特点:每个结点包含数据域+三个指针域(左、右、双亲)
- 应用场景:需要频繁查找父结点的情况
二、二叉树的遍历
- 核心原则:每个结点访问且仅访问一次
- 分类依据:根据访问根结点的次序不同分为四种方法
1. 中序遍历法
- 访问顺序:左子树→根结点→右子树(递归执行)
- 记忆口诀:"左中右"
- 递归特性:处理子树时仍需采用中序遍历法
1)例题:二叉树中序遍历
- 解题步骤:
- 从根结点A开始,先处理左子树BDG
- 对B结点执行"左中右":无左子→访问B→处理右子树DG
- 对D结点执行"左中右":访问G→访问D→无右子
- 返回访问根结点A
- 处理右子树ECHFI:访问E→访问C→处理右子树HFI
- 对F结点执行"左中右":访问H→访问F→访问I
- 最终序列:B→G→D→A→E→C→H→F→I
- 技巧:可默念"左中右"辅助分析,注意递归处理每棵子树
三、最优二叉树
1. 最优二叉树的概念
- 别名:又称哈夫曼树(Huffman Tree),音译不同时也可能称为霍夫曼树
- 核心特征:是一类带权路径长度最短的树结构
- 权值定义:人为赋予的概念,实践中可表示节点访问频率等,不同场景可能有不同含义
- 路径长度:节点到根节点之间的连线数量(如全值为4的节点路径长度为2)
- 节点带权路径长度:路径长度×节点权值(如路径长度2×权值2=4)
- 树的带权路径长度:所有叶子节点带权路径长度之和(不包括内部节点)
2. 应用案例
1)例题:哈夫曼树构造
- 构造原理:
- 初始:将每个权值作为独立树(如{30,25,15,22,8})
- 迭代:每次合并权值最小的两棵树,新根权值为子树权值和
- 终止:集合中只剩一棵树时即为哈夫曼树
- 构造示例:
- 合并最小权值8和15→新节点23
- 合并22和23→新节点45
- 合并25和30→新节点55
- 最后合并45和55→根节点100
- 注意事项:
- 构造结果不唯一(左右子树可互换)
- 仅叶子节点保留原始权值
- 标准步骤:
- 创建n棵单节点树构成森林F
- 选取F中权值最小的两棵树合并
- 新树根权值=左右子树根权值之和
- 重复步骤2-3直到只剩一棵树
3. 最优二叉树的一个应用
- 典型应用:字符编码与译码系统
- 实现原理:
- 高频字符分配短编码(靠近根节点)
- 低频字符分配长编码
- 保证编码的前缀特性(无二义性)
- 教材参考:具体案例参见教材第96页示例
四、二叉查找树
1. 二叉查找树的定义
- 别称:又称为二叉排序树
- 结构性质:
- 是一棵空树,或满足以下性质的二叉树:
- 左子树规则:若左子树非空,则左子树上所有结点的关键码值均小于根结点的关键码值
- 右子树规则:若右子树非空,则右子树上所有结点的关键码值均大于根结点的关键码值
- 递归性质:左、右子树本身也必须是二叉查找树
- 是一棵空树,或满足以下性质的二叉树:
- 遍历特性:
- 中序有序性:对二叉查找树进行中序遍历,可得到关键码递增有序的结点序列
- 核心优势:
- 查找效率:相比普通二叉树,能更高效地进行数值查找
2. 应用案例
1)例题:二叉查找树例子
- 正确示例分析:
- 根节点46的左子树(43,38,25)均小于46
- 右子树(54,98,62,91)均大于46
- 子树验证:
- 左子树13的左节点4<13,右子树25<38
- 右子树54的右子树98>54,62<98且91>62
- 错误示例分析:
- 根节点54的右子树出现46<54,违反右子树规则
- 中序遍历结果将出现54后接46的逆序情况
- 查找演示:
- 查找98:46→54→98(比较3次)
- 查找62:46→54→98→62(比较4次)
- 每次比较可排除一半子树,类似二分查找
- 查找原理:
- 从根节点开始比较:
- 目标值=当前节点:查找成功
- 目标值<当前节点:进入左子树
- 目标值>当前节点:进入右子树
- 从根节点开始比较:
- 效率对比:
- 普通二叉树需要遍历所有节点
- 二叉查找树平均时间复杂度为O(logn)
- 验证方法:
- 中序遍历结果必须严格递增
- 每个节点需满足左<根<右的递归关系
五、知识小结
|--------------|-------------------------------------------------------------|------------------------------------------------|------|
| 知识点 | 核心内容 | 考试重点/易混淆点 | 难度系数 |
| 二叉树的存储结构 | 分为顺序存储(适合完全/满二叉树)和链式存储(适合普通二叉树,含二叉链表和三叉链表) | 顺序存储的浪费问题(非完全二叉树不适用) 三叉链表的双向特性(比二叉链表多存储双亲节点指针) | ⭐⭐ |
| 二叉树的遍历方法 | 中序(左根右)、前序(根左右)、后序(左右根) 示例:中序遍历结果为 b g d a e c h f i | 递归定义的应用 考试高频:根据树形写出遍历序列 | ⭐⭐⭐ |
| 最优二叉树(哈夫曼树) | 带权路径长度最短的树 构造方法:每次合并权值最小的两节点,生成新节点(权值为和) | 带权路径长度计算(仅叶子节点参与) 非唯一性(左右子树顺序可调换) | ⭐⭐⭐⭐ |
| 二叉查找树(二叉排序树) | 性质:左子树节点值 < 根节点值 < 右子树节点值 作用:中序遍历得有序序列,查找效率高(类似二分查找) | 判定标准(需递归满足性质) 易错点:右子树出现小于根节点的值即非法 | ⭐⭐⭐ |
| 对比维度 | 存储效率:顺序存储 vs 链式存储 遍历复杂度:递归实现 vs 非递归实现 应用场景:哈夫曼编码 vs 二叉查找树检索 | | |