计算机中级-数据库系统工程师-数据结构-树与二叉树(2)

一、二叉树的存储结构
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(log⁡n)
  • 验证方法:
    • 中序遍历结果必须严格递增
    • 每个节点需满足左<根<右的递归关系
五、知识小结

|--------------|-------------------------------------------------------------|------------------------------------------------|------|
| 知识点 | 核心内容 | 考试重点/易混淆点 | 难度系数 |
| 二叉树的存储结构 | 分为顺序存储(适合完全/满二叉树)和链式存储(适合普通二叉树,含二叉链表和三叉链表) | 顺序存储的浪费问题(非完全二叉树不适用) 三叉链表的双向特性(比二叉链表多存储双亲节点指针) | ⭐⭐ |
| 二叉树的遍历方法 | 中序(左根右)、前序(根左右)、后序(左右根) 示例:中序遍历结果为 b g d a e c h f i | 递归定义的应用 考试高频:根据树形写出遍历序列 | ⭐⭐⭐ |
| 最优二叉树(哈夫曼树) | 带权路径长度最短的树 构造方法:每次合并权值最小的两节点,生成新节点(权值为和) | 带权路径长度计算(仅叶子节点参与) 非唯一性(左右子树顺序可调换) | ⭐⭐⭐⭐ |
| 二叉查找树(二叉排序树) | 性质:左子树节点值 < 根节点值 < 右子树节点值 作用:中序遍历得有序序列,查找效率高(类似二分查找) | 判定标准(需递归满足性质) 易错点:右子树出现小于根节点的值即非法 | ⭐⭐⭐ |
| 对比维度 | 存储效率:顺序存储 vs 链式存储 遍历复杂度:递归实现 vs 非递归实现 应用场景:哈夫曼编码 vs 二叉查找树检索 | | |

相关推荐
gjc5922 小时前
零基础OceanBase数据库入门(2):查看集群基本信息
数据库·oceanbase
boonya2 小时前
Embedding模型与向量维度动态切换完整方案
java·数据库·embedding·动态切换大模型
运维行者_2 小时前
使用 Applications Manager 实现 AWS 云监控:保障业务应用高效运行
大数据·运维·服务器·网络·数据库·云计算·aws
Dr.F.Arthur2 小时前
我的算法笔记——哈希表篇
数据结构·笔记·散列表
lifewange2 小时前
postman接口自动化如何进行参数化
数据库·自动化·postman
刘~浪地球2 小时前
Redis 从入门到精通(三):键操作命令详解
数据库·redis·缓存
漂流瓶jz2 小时前
UVA-11846 找座位 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·排序算法·深度优先·aoapc·算法竞赛入门经典·uva
高梦轩3 小时前
MySQL 故障排查与优化
数据库·mysql
吴声子夜歌3 小时前
Node.js——操作MySQL数据库
数据库·mysql·node.js