要高效记忆数据结构中“树”相关考点,掌握系统化的速记口诀是关键。以下将围绕二叉树、哈夫曼树、树的遍历与存储等核心考点,结合具体例子和对比表格,提供一套实用的速记方案。
一、二叉树核心性质速记口诀
二叉树的性质是计算与推导的基础,可用以下口诀串联记忆:
口诀一:二叉树,性质五,一二三四要记住。
一二三,层结点,等比数列和来求。
四与五,总高度,叶子结点有讲究。
-
解释与对应考点:
- 性质1:在二叉树的第
i层上至多有2^(i-1)个结点(i≥1)。这是计算各层最大结点数的基础 。 - 性质2:深度为
k的二叉树至多有2^k - 1个结点(k≥1)。这是求满二叉树结点总数的公式。 - 性质3:对任何一棵二叉树,若其终端结点(叶子结点)数为
n0,度为2的结点数为n2,则n0 = n2 + 1。这是高频考点! 常用于已知树形求各类结点数 。 - 性质4 & 5:具有
n个结点的完全二叉树的深度为⌊log₂n⌋ + 1。深度为k的完全二叉树,其n个结点按层序编号后,对任一结点i(1≤i≤n),其双亲、左右孩子的编号有固定计算关系。这些是判断完全二叉树和计算高度的核心。
- 性质1:在二叉树的第
-
应用示例:
已知一棵完全二叉树有1001个结点,其中叶子结点有多少个?
推导:设叶子结点数为n0,度为1的结点数为n1,度为2的结点数为n2。总节点数n = n0 + n1 + n2 = 1001。
由性质3:n0 = n2 + 1。
在完全二叉树中,n1只能是0或1。因为n0 + n1 + n2 = 1001且n0 = n2 + 1,代入得(n2+1) + n1 + n2 = 1001=>2*n2 + n1 = 1000。
为使n1为整数,n1必须为0(若n1=1,则2*n2=999,n2非整数)。解得n2=500,n0 = n2 + 1 = 501。
二、哈夫曼树构建与编码速记口诀
哈夫曼树(最优二叉树)用于数据压缩,其构建和编码规则是常考点。
口诀二:哈夫曼,建树法,权小先合不停下。
左零右一标路径,前缀编码不混淆。
-
解释与操作流程 :
- 建树三步法:给定
n个权值{w1, w2, ..., wn}。- Step1:将权值视为
n棵仅含根节点的二叉树,构成森林F。 - Step2:从
F中选出两棵根节点权值最小的树作为左右子树,构造一棵新二叉树,新树根节点的权值为其左右子树根节点权值之和。 - Step3:将新树加入
F,同时删除那两棵旧树。 - 重复 Step2、Step3,直到
F中只剩一棵树,即为哈夫曼树。
- Step1:将权值视为
- 编码规则:从根到叶子的路径上,左分支标0,右分支标1。从根到每个叶子节点的路径序列即为该叶子对应字符的哈夫曼编码。哈夫曼编码是前缀编码,即任一字符的编码都不是另一字符编码的前缀。
- 建树三步法:给定
-
代码示例(模拟构建过程):
# 哈夫曼树节点定义与构建思路示意 class HuffmanNode: def __init__(self, weight, char=None): self.weight = weight # 权值 self.char = char # 字符(叶子节点) self.left = None self.right = None # 构建哈夫曼树的核心是使用优先队列(最小堆)反复合并最小权值节点 import heapq def build_huffman_tree(weights_chars): # weights_chars: [(weight, char), ...] heap = [HuffmanNode(w, c) for w, c in weights_chars] heapq.heapify(heap) # 建最小堆,按weight排序 while len(heap) > 1: left = heapq.heappop(heap) # 取最小 right = heapq.heappop(heap) # 取次小 # 合并为新节点,权值相加 merged = HuffmanNode(left.weight + right.weight) merged.left, merged.right = left, right heapq.heappush(heap, merged) return heap[0] # 返回根节点
三、二叉树遍历序列重建口诀
已知两种遍历序列(如前序+中序)重建二叉树是经典题型。
口诀三:前序中序可建树,根左右与左根右。
前序首结是树根,中序切分左右林。
递归应用此法则,二叉树形自然成。
-
解释与步骤 :
- 前序遍历:
根节点 -> 左子树 -> 右子树 - 中序遍历:
左子树 -> 根节点 -> 右子树 - 重建步骤:
- 定根:前序序列的第一个元素一定是整棵树的根节点。
- 分割:在中序序列中找到这个根节点,其左侧子序列构成左子树的中序遍历,右侧子序列构成右子树的中序遍历。
- 递归:根据左、右子树的节点数量,在前序序列中划分出对应的左子树前序和右子树前序序列。
- 对左、右子树递归执行上述过程。
- 前序遍历:
-
应用示例:
前序:A B D E C F
中序:D B E A F C
重建:- 根为
A(前序首元素)。 - 中序中
A左侧D B E是左子树,右侧F C是右子树。 - 前序中,根
A之后跟的3个字符B D E应与左子树3个节点对应,剩下C F对应右子树。 - 对左子树(前序:
B D E, 中序:D B E)递归,根为B,中序中B左侧D是左子树,右侧E是右子树。以此类推。
- 根为
四、树、森林与二叉树转换关系速记
口诀四:树转二叉,孩子左,兄弟右,森林同理首树根。
二叉转回,逆过程,左孩右兄再还原。
- 解释与对比:
此口诀概括了树/森林与二叉树之间转换的“左孩子右兄弟”表示法核心规则。掌握此规则有助于理解不同结构间的等价关系。
五、重要概念对比速记表
将易混淆的树相关概念进行对比,能有效强化记忆。
| 概念对比项 | 二叉排序树 (BST) | 平衡二叉树 (AVL) | 哈夫曼树 |
|---|---|---|---|
| 核心目标 | 实现动态查找,保持数据有序性 | 提升BST查找效率,防止退化 | 实现最优前缀编码,用于数据压缩 |
| 关键性质 | 左子树所有节点值 < 根 < 右子树所有节点值 | 是BST,且每个节点左右子树高度差绝对值 ≤1 | 带权路径长度(WPL)最小的二叉树 |
| 操作关注点 | 插入、删除后需保持有序性 | 插入、删除后需通过旋转保持平衡 | 构建时每次合并权值最小的两棵树 |
| 典型应用 | 动态查找表 | 需要频繁查找的场景(如数据库索引) | 文件压缩(ZIP)、编码(Huffman Coding) |
记忆要点:二叉排序树重在“序”,平衡二叉树重在“衡”(高度平衡),哈夫曼树重在“权”(带权路径最短)。
六、真题实战与错题模板
结合历年真题,可以总结出常见题型的解题模板。
-
题型:计算二叉树各类结点数
- 模板:
- 明确已知条件(总结点数
n、叶子结点数n0、度为1的结点数n1、度为2的结点数n2中的哪些)。 - 列出基本方程:
n = n0 + n1 + n2。 - 列出核心关系:
n0 = n2 + 1(二叉树性质)。 - 联立求解。
- 明确已知条件(总结点数
- 模板:
-
题型:根据遍历序列重建二叉树
- 模板:
- 前序+中序:用口诀三。
- 后序+中序:后序的最后一个元素是根,其余步骤类似。
- 注意:仅凭前序+后序通常无法唯一确定二叉树,除非是满二叉树或真二叉树。
- 模板:
通过上述口诀串联核心性质、表格对比易混概念、代码理解构建过程、以及模板化解题思路,能够系统化地掌握“树”这一重要数据结构的考点,实现高效记忆与准确应用。在复习时,应着重练习利用性质3进行结点数计算、根据两种遍历序列手动画出二叉树结构,以及手动构建哈夫曼树并写出编码,这些都是考场上的高频得分点 。
参考来源
- 数据结构(十三)----几种特殊的树(万字解析,含例题)
- 软考中级数据结构5分怎么拿?线性表、栈、队列、树核心考点与速记口诀(附真题解析)
- 考点速记与笔记整理:各科高频考点+思维导图+口诀记忆+错题模板+易混对比
- 信息系统项目管理师重要考点记忆口诀
- 中医基础之 “津液” 基本概念全攻略|功能考点+真题+速记口诀
- 体系化的信息系统项目管理师考点速记口诀
368

被折叠的 条评论
为什么被折叠?



