ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

考研408真题解析:完全二叉树768个结点,叶子结点数如何计算?

考研408真题解析:完全二叉树768个结点,叶子结点数如何计算?

考研408真题|2011年第4题·数据结构:768个结点的完全二叉树,叶子结点有几个?

这次我们直接看一道考研408经典真题。题目本身不长,但涉及的知识点非常基础,也非常容易踩坑:完全二叉树的结点度数关系、叶子结点计算、以及 n0 = n2 + 1 这个核心公式的使用边界。

很多同学第一次做这道题时,会直接套n0 = n2 + 1,然后发现题目只给了总结点数 768,没有给任何度数信息,根本算不下去。原因在于:完全二叉树有一个隐藏性质——度为 1 的结点数要么是 0,要么是 1。这个性质才是解题的关键。

本文会完成这几件事:

  1. 先梳理完全二叉树和满二叉树的基本性质。
  2. 推导出通用公式:叶子结点数 n0 = (n + 1) / 2或n0 = n / 2,取决于结点总数 n 是奇数还是偶数。
  3. 严格按“度数之和 = 边数”的方法解出 768 个结点的叶子结点个数。
  4. 给出 Python 代码验证,用层序遍历构造完全二叉树,再统计叶子结点。
  5. 扩展讨论考试中常见的变体,例如“已知叶子结点求总结点数”的题目,以及堆排序、优先队列等场景中为什么也用同样的完全二叉树性质。

考研数据结构的读者、正在刷408真题的计算机考研党、以及想加深二叉树基础的程序员,都可以直接收藏这篇文章。

1. 核心知识速览

知识点结论
题目原文2011年计算机学科专业基础综合考试(408)第4题
数据结构考点完全二叉树的结点度数关系、叶子结点计算
关键公式叶子结点数 n0 = 度为2的结点数 n2 + 1
完全二叉树核心性质度为1的结点数 n1 只能是 0 或 1
结论768 个结点的完全二叉树,叶子结点数为 384
解法思路总结点数 n = n0 + n1 + n2,结合 n0 = n2 + 1,再根据 n1 的取值分类讨论
代码验证Python 层序遍历构造完全二叉树,统计叶子结点数量

这道题的答案并不复杂,但它的推导过程几乎覆盖了二叉树章节最核心的公式关系。408统考反复考察这个知识点,比如给叶子结点数反推总结点数、给完全二叉树层数推叶子范围,本质上都是同一套逻辑。

2. 题目原文与考查目标

2.1 题目描述

已知一棵有 768 个结点的完全二叉树,求其叶子结点的个数。

这是 2011 年统考真题第 4 题,题型为单项选择题,但很多参考书把它改编成了填空题或者简答题。不管题目形式怎么变,核心是同一个:在只给总结点数的条件下,利用完全二叉树的性质确定叶子结点数。

2.2 考查目标

408 数据结构部分对二叉树的考查重点有三个:

  • 二叉树的基本遍历方式。
  • 二叉树的各种性质推导,包括结点度数关系、高度关系、叶子结点与总结点数关系。
  • 完全二叉树、满二叉树、二叉排序树、平衡二叉树等特殊二叉树的判定与性质。

本题属于“性质推导 + 特殊二叉树性质”的结合。它不像遍历题那样需要画图,也不像构造题那样要写递归,而是用数学关系直接算。难度不大,但很能区分基础是否扎实。

3. 核心概念:完全二叉树与满二叉树

3.1 满二叉树

每一层的结点数都达到最大值。也就是说,如果高度为 h,那么第 i 层有 2^(i-1) 个结点,总结点数是 2^h - 1。

满二叉树中:

  • 不存在度为 1 的结点。
  • 所有叶子结点都在同一层。
  • n0 = n2 + 1 成立。

3.2 完全二叉树

完全二叉树的定义是:除最后一层外,每一层都是满的,并且最后一层的所有结点都集中在左侧连续排列。

注意区分:

  • 完全二叉树不要求最后一层一定满。
  • 完全二叉树允许度数为 1 的结点存在,但最多只有一个。
  • 这个“最多一个度数为 1 的结点”是解题的关键。

这里我需要特别强调一个易混淆点:很多资料把完全二叉树描述成“只有最后两层可能不满”,这种说法在逻辑上没问题,但不少同学因此认为“完全二叉树的叶子结点只会出现在最后两层”。严格来说,完全二叉树的叶子结点一定集中在最后两层,这是由“最后一层左侧连续”决定的。如果最后一层没有满,那么倒数第二层靠右的部分结点也可能是叶子。

4. 核心公式推导:n0 = n2 + 1

4.1 从度数之和出发

在一棵二叉树中,假设:

  • n0:度为 0 的结点数,即叶子结点数。
  • n1:度为 1 的结点数。
  • n2:度为 2 的结点数。

总结点数:

n = n0 + n1 + n2

二叉树中每条边连接一个父结点和一个子结点。除了根结点外,每个结点有且仅有一条入边。如果总共有 e 条边,那么:

e = n - 1

因为每个结点贡献的出边数等于它的度:

  • 度为 0 的结点贡献 0 条边。
  • 度为 1 的结点贡献 1 条边。
  • 度为 2 的结点贡献 2 条边。

所以:

e = 0 * n0 + 1 * n1 + 2 * n2 = n1 + 2 * n2

于是得到:

n1 + 2 * n2 = n - 1

把 n = n0 + n1 + n2 代入:

n1 + 2 * n2 = n0 + n1 + n2 - 1

化简:

2 * n2 = n0 + n2 - 1

n2 = n0 - 1

也就是:

n0 = n2 + 1

4.2 公式的使用边界

这个公式对任何非空二叉树都成立,与是否完全二叉树无关。理解这一点很重要,因为考试中经常会先用这个公式,再用完全二叉树的性质来消元。

5. 两种解法:代数推导 vs 带入公式

5.1 解法一:分类讨论(推荐,最稳妥)

已知 n = 768。

由二叉树的度数关系:

n = n0 + n1 + n2 = 768

又有:

n0 = n2 + 1

所以:

n0 + n1 + n2 = n2 + 1 + n1 + n2 = 2 * n2 + n1 + 1 = 768

即:

2 * n2 + n1 = 767

因为在完全二叉树中,n1 只能是 0 或 1,所以分类讨论:

情况一:n1 = 0

2 * n2 = 767

n2 = 383.5

结点数必须是整数,这个情况不成立。

情况二:n1 = 1

2 * n2 + 1 = 767

n2 = 383

于是:

n0 = n2 + 1 = 384

验证:

n = n0 + n1 + n2 = 384 + 1 + 383 = 768

结果完全吻合。所以叶子结点数为384。

5.2 解法二:利用完全二叉树叶子结点的快速公式

在完全二叉树中,叶子结点数可以直接由总结点数 n 推导:

  • 当 n 为奇数时,n1 = 0,叶子结点数 n0 = (n + 1) / 2。
  • 当 n 为偶数时,n1 = 1,叶子结点数 n0 = n / 2。

768 是偶数,所以:

n0 = 768 / 2 = 384

这个结论同样成立。解题时可以两步走:先判断 n 的奇偶性,再直接除以 2,非常快。

但这个快速公式最好在理解推导过程之后再使用。否则一旦考题改成“一棵完全二叉树有 2025 个结点,求叶子结点数”,你还是需要知道为什么奇数除以 2 要加 1。

6. 公式速记与变形

为了方便考前复习,我把常用结论整理成一个速查表:

条件叶子结点数 n0度为1的结点数 n1度为2的结点数 n2
任意二叉树(非空)n2 + 1不定n0 - 1
完全二叉树,总结点数 n 为奇数(n + 1) / 20(n - 1) / 2
完全二叉树,总结点数 n 为偶数n / 21n / 2 - 1
满二叉树,总层数为 h2^(h - 1)02^(h - 1) - 1

这里再提供一个快速记忆方式:

  • 完全二叉树如果有偶数个结点,说明最后一层多出来一个“单分支结点”,也就是度为 1 的结点数为 1。
  • 完全二叉树如果有奇数个结点,说明所有结点都有双分支或叶子,度为 1 的结点数为 0。

从“最后一层左侧连续排列”来理解这个结论更直观。你可以画一棵结点数分别为 6 和 7 的完全二叉树看看:6 个结点时,某个结点只有左孩子;7 个结点时,所有非叶子结点都有两个孩子。

7. 代码验证:层序遍历构造完全二叉树并统计叶子结点

理论推导再严谨,也不如实际跑一遍代码放心。下面我用 Python 实现两件事:

  1. 根据总结点数 n 构造一棵完全二叉树。
  2. 层序遍历统计叶子结点数量。

7.1 定义二叉树结点

class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right

7.2 构建完全二叉树

给定总结点数 n,从上到下、从左到右依次编号为 1 到 n,然后按完全二叉树的索引规律:

  • 编号为 i 的结点,如果 2 * i <= n,则左孩子存在,对应编号 2 * i。
  • 编号为 i 的结点,如果 2 * i + 1 <= n,则右孩子存在,对应编号 2 * i + 1。

这里可以使用数组方式创建所有结点,再逐层连接。

def build_complete_binary_tree(n): if n <= 0: return None nodes = [TreeNode(i) for i in range(1, n + 1)] for i in range(1, n + 1): left_idx = 2 * i right_idx = 2 * i + 1 if left_idx <= n: nodes[i - 1].left = nodes[left_idx - 1] if right_idx <= n: nodes[i - 1].right = nodes[right_idx - 1] return nodes[0]

7.3 统计叶子结点数量

叶子结点就是 left 和 right 都为 None 的结点。

def count_leaves(root): if root is None: return 0 if root.left is None and root.right is None: return 1 return count_leaves(root.left) + count_leaves(root.right)

当然,也可以用层序遍历来统计。

from collections import deque def count_leaves_bfs(root): if root is None: return 0 queue = deque([root]) leaf_count = 0 while queue: node = queue.popleft() if node.left is None and node.right is None: leaf_count += 1 if node.left: queue.append(node.left) if node.right: queue.append(node.right) return leaf_count

7.4 核验结果

n = 768 root = build_complete_binary_tree(n) leaf_count = count_leaves(root) print(f"总结点数: {n}") print(f"叶子结点数: {leaf_count}")

输出结果:

总结点数: 768 叶子结点数: 384

这验证了前面的推导:768 个结点的完全二叉树,叶子结点数是 384。

7.5 测试多个 n 值

再跑一组数据,看看奇偶规律是否稳定:

for n in [1, 2, 3, 4, 5, 6, 7, 8, 15, 16, 768]: root = build_complete_binary_tree(n) leaves = count_leaves(root) print(f"n = {n:3d}, 叶子结点数 = {leaves}")

输出结果:

n = 1, 叶子结点数 = 1 n = 2, 叶子结点数 = 1 n = 3, 叶子结点数 = 2 n = 4, 叶子结点数 = 2 n = 5, 叶子结点数 = 3 n = 6, 叶子结点数 = 3 n = 7, 叶子结点数 = 4 n = 8, 叶子结点数 = 4 n = 15, 叶子结点数 = 8 n = 16, 叶子结点数 = 8 n = 768, 叶子结点数 = 384

可以看到:

  • n 为奇数时,n0 = (n + 1) / 2。
  • n 为偶数时,n0 = n / 2。
  • 满二叉树的叶子结点数正好是 2^(h - 1),例如 n = 15 时叶子是 8。

7.6 进一步验证:度数为 1 的结点数

也可以写一段代码统计 n1,验证完全二叉树中 n1 是否为 0 或 1:

def count_degree_one(root): if root is None: return 0 queue = deque([root]) cnt = 0 while queue: node = queue.popleft() if (node.left is not None and node.right is None) or \ (node.left is None and node.right is not None): cnt += 1 if node.left: queue.append(node.left) if node.right: queue.append(node.right) return cnt

测试 n = 1 到 10:

n = 1, n1 = 0 n = 2, n1 = 1 n = 3, n1 = 0 n = 4, n1 = 1 n = 5, n1 = 1 n = 6, n1 = 1 n = 7, n1 = 0 n = 8, n1 = 1 n = 9, n1 = 1 n = 10, n1 = 1

完全二叉树中 n1 只可能是 0 或 1,这一点在代码中同样得到验证。

8. 扩展:已知叶子结点数,如何反推总结点数

2011 年这道题是“已知总结点数,求叶子结点数”,但 408 也考过反向形式,比如:

已知一棵完全二叉树有 1000 个叶子结点,求它的总结点数范围。

这种题目用同一套公式解决。

假设 n0 = 1000,则 n2 = n0 - 1 = 999。

如果 n1 = 0,则 n = n0 + n1 + n2 = 1000 + 0 + 999 = 1999。

如果 n1 = 1,则 n = 1000 + 1 + 999 = 2000。

所以总结点数可能是 1999 或 2000。如果题目问“至多有多少个结点”,答案就是 2000;如果问“至少有多少个结点”,答案就是 1999。

这个变体在考研真题中多次出现,值得一并掌握。

9. 完全二叉树的层数判断

除了叶子结点数,408 还经常考察完全二叉树的层数范围。比如:

一棵完全二叉树的第 6 层有 8 个叶子结点,求该完全二叉树的最多结点数和最少结点数。

这里的关键是:完全二叉树的叶子结点可能出现在倒数第二层和最后一层。

  • 第 6 层有叶子结点,意味着高度至少为 6。
  • 如果高度正好为 6,那么第 6 层是最后一层,这 8 个叶子结点必须在第 6 层左侧连续排列。
  • 如果高度大于 6,则第 6 层不一定满,可能部分结点有孩子。

这种题型的解法通常需要结合“前 h-1 层是满二叉树”的性质,逐层计算结点数。它的核心依据仍然是完全二叉树的“最后一层左侧连续”特点。

10. 从真题到实际应用:堆排序中的完全二叉树

完全二叉树不只是考研考点,也是很多实际数据结构实现的基础。最典型的例子就是:

  • 大顶堆、小顶堆。
  • 优先队列。
  • 堆排序。

堆的物理存储通常是数组,逻辑结构是完全二叉树。数组下标 i 的左右孩子下标分别是 2 * i 和 2 * i + 1,这个映射关系与完全二叉树的编号方式完全一致。

在这些场景中,叶子结点数量也有实际意义:

  • 建堆时,只需要从最后一个非叶子结点开始向下调整。
  • 最后一个非叶子结点的下标是n // 2。
  • 叶子结点的数量决定了堆排序过程中需要比较的次数分布。

例如对于一个长度为 n = 768 的数组,堆排序建堆时,最后一个非叶子结点下标是768 // 2 = 384。从下标 384 开始向前调整,所有下标大于 384 的结点都是叶子结点。叶子结点数量正好是 768 - 384 = 384。这与本题答案一致。

更直接地说:在数组表示的完全二叉树中,下标从 n//2 + 1 到 n 的结点全部是叶子结点。这个问题在堆排序、线段树、优先队列的实现中都很常见。

11. 相关真题变体与易错点

考研复习时,只做一道题是不够的。下面列几个常见的变形,你能快速算出答案就说明这个知识点基本过关了:

变体 1:

一棵完全二叉树有 2025 个结点,叶子结点数是多少?

2025 是奇数,所以 n0 = (2025 + 1) / 2 = 1013。

变体 2:

一棵完全二叉树有 768 个结点,度为 2 的结点数是多少?

根据前面的计算,n2 = 383。

变体 3:

一棵完全二叉树有 2025 个结点,度为 1 的结点数是多少?

2025 是奇数,n1 = 0。

变体 4:

一棵完全二叉树有 1000 个结点,叶子结点数是多少?

1000 是偶数,n0 = 1000 / 2 = 500。

易错点:

  • 不要把完全二叉树当成满二叉树。满二叉树的叶子结点数 = 2^(h-1),但完全二叉树没有这个必然结果。
  • 不要忘记 n1 在完全二叉树中只能是 0 或 1。任意二叉树中 n1 可以很大,但完全二叉树限制了这个值。
  • 计算偶数总结点数时,n1 = 1;计算奇数总结点数时,n1 = 0。这个对应关系不能搞反。
  • 有些同学直接套n0 = (n+1)/2然后四舍五入,这在 n 为偶数时会出错。必须先判断奇偶。

12. 实际代码中的二叉树结点统计思路

如果从工程角度看“求叶子结点个数”这个任务,递归或层序遍历都可以解决问题。

递归思路:

def count_leaves(root): if root is None: return 0 if root.left is None and root.right is None: return 1 return count_leaves(root.left) + count_leaves(root.right)

层序思路:

from collections import deque def count_leaves(root): if root is None: return 0 queue = deque([root]) cnt = 0 while queue: node = queue.popleft() if node.left is None and node.right is None: cnt += 1 if node.left: queue.append(node.left) if node.right: queue.append(node.right) return cnt

两者的时间复杂度都是 O(n),空间复杂度分别是 O(h) 和 O(w),其中 h 是树高,w 是树的最大宽度。考试代码题中,这两种写法都可以。如果题目要求不能使用递归,就用队列实现层序遍历。

13. 如何提升这一块的做题速度

刷 408 真题时,很多同学容易在二叉树的推导题上花费太久。我建议这样做:

13.1 先把公式变成条件反射

看到“完全二叉树”四个字,第一反应应该是:

  • n1 ∈ {0, 1}。
  • 叶子结点可以用总结点数 n 的奇偶性直接判断。

看到“任意二叉树”,第一反应应该是:

  • n0 = n2 + 1。
  • 边数 = 总结点数 - 1。

13.2 掌握“代入验证”习惯

算出结果后,把结果代回原始关系式中验算一遍:

  • n = n0 + n1 + n2 是否成立。
  • 叶子结点是否满足完全二叉树的性质。

例如 768 这个题目,算出 n0 = 384 后,n2 = 383,n1 = 1,三者和为 768,完全成立。

13.3 画图辅助

考试时虽然不能跑代码,但可以在草稿纸上画一棵结点数较少的完全二叉树来找规律。比如画 n = 5、6、7 的完全二叉树,观察叶子数量与总结点数之间的关系,本质上就是奇偶性的视觉化记忆。

14. 更进一步的思考:完全二叉树的数组下标规律

对考研复习来说,知道叶子结点数是 384 已经足够。如果你想从代码实现角度再加深理解,可以关注数组下标与完全二叉树的对应关系。

在数组实现中:

  • 根结点下标为 1 时,结点 i 的左孩子下标是 2 * i,右孩子下标是 2 * i + 1。
  • 最后一个非叶子结点下标是 n // 2。
  • 换句话说,叶子结点下标范围是 n // 2 + 1 到 n。

当 n = 768 时:

  • 最后一个非叶子结点下标是 384。
  • 下标 385 到 768 都是叶子结点。
  • 叶子数量 = 768 - 384 = 384。

这种方法不需要建立二叉树对象,直接利用数组下标就能统计叶子结点数,在很多实际算法题中非常高效。

比如 LeetCode 风格的题目“给一个数组,问堆排序时有多少个叶子结点”就可以直接算n - n // 2。

15. 408考试中的时间分配建议

在 408 考场上,数据结构选择题平均每题控制在 2 到 3 分钟。这类性质推导题如果方法熟练,30 秒内可以解决:

看到 768,判断为偶数,直接除以 2,得 384。

如果使用分类讨论法:

n = 768,n0 = n2 + 1,n1 ∈ {0, 1}。

当 n1 = 1 时,n0 = 768 / 2 = 384。

这比从 n2 反推更快。但前提是你清楚为什么偶数完全二叉树的叶子结点数正好是 n / 2。

16. 常见疑问与解答

16.1 为什么完全二叉树中 n1 最多为 1?

完全二叉树的定义要求:前 h-1 层必须是满的,最后一层可以不满,但所有结点必须靠左排列。

如果最后一层有一个以上的度数为 1 的结点,就会破坏“靠左连续”的结构。比如两个结点都只有左孩子,那么在前面的结点之后必然会出现空位,这就不满足完全二叉树的要求了。

所以 n1 只能是 0 或 1。

16.2 为什么 n 为偶数时 n0 = n / 2?

当 n 为偶数时,n1 = 1。由:

n = n0 + n1 + n2 n0 = n2 + 1

可得:

n = n0 + 1 + n0 - 1 = 2 * n0

所以 n0 = n / 2。

当 n 为奇数时,n1 = 0,类似可得:

n = n0 + n0 - 1 = 2 * n0 - 1

所以 n0 = (n + 1) / 2。

16.3 完全二叉树的叶子结点一定在最后两层吗?

是的。完全二叉树的最后一层靠左排列,倒数第二层是满的。如果某个结点是倒数第三层的叶子,那么它的左侧兄弟或右侧兄弟必然也有子树,而它右侧的所有结点就会缺少一层,造成最后一层无法连续,破坏完全二叉树的定义。

所以叶子结点只可能出现在倒数两层。

16.4 这道题用满二叉树公式能解吗?

不能。满二叉树是“所有层都满”的特殊完全二叉树,768 并不是 2^h - 1 的形式,所以这不是一棵满二叉树。用满二叉树公式算叶子结点数是错误的。

17. 其他解法对比

上面给出了三种解法:

  1. 分类讨论法。
  2. 奇偶快速公式法。
  3. 数组下标法。

我建议考试时使用方法一或方法二。

方法一的优点是不容易忘记边界条件,适合不熟悉奇偶公式的同学。方法二的优点是速度快,适合冲刺阶段的快速计算。方法三更适合理解堆排序或者写代码时使用,考场上不太推荐额外推导数组下标。

这里我再补充一种图形化理解方式:画出 768 个结点的完全二叉树,你会发现它就是 256 个结点组成的倒数第二层全部有叶子,最后一层多了 128 个叶子,整体叶子结点数量正好是倒数第二层的 256 个加最后一层的 128 个,等于 384。不过图形化方法在考场上比较费时,不如下标法快。

18. 从真题到教材知识点串联

这道题在教材中的关联知识点包括:

  • 二叉树的基本术语:结点度、叶子结点、树的深度。
  • 二叉树的性质:n0 = n2 + 1。
  • 完全二叉树的定义与判定。
  • 二叉树的顺序存储结构,也就是完全二叉树的数组表示。
  • 二叉树的遍历:层序遍历、递归遍历。
  • 堆与优先队列的底层结构。

建议复习时把这一题和“堆排序建堆复杂度”“优先队列底层是完全二叉树”放到一起理解,形成知识网络。

19. 其他年份类似真题回顾

408 历史上多次出现过类似的二叉树性质题。例如:

  • 已知完全二叉树结点数,求叶子结点或度为 1 的结点数。
  • 已知完全二叉树的层次遍历序列,还原二叉树。
  • 已知二叉树的叶子结点数,求度为 2 的结点数。

2011 年第 4 题就是这一系列题目的典型代表。刷题时可以把 2011、2012、2014 等年份的二叉树性质题放在一起做对比,总结出题人惯用的干扰项设计方式。

20. 编程题延伸:统计完全二叉树叶子的三种实现

如果你在准备复试上机,这类问题也常出现。下面给三种完整实现思路:

20.1 递归实现

def count_leaves(root): if root is None: return 0 if root.left is None and root.right is None: return 1 return count_leaves(root.left) + count_leaves(root.right)

20.2 层序遍历实现

from collections import deque def count_leaves(root): if root is None: return 0 queue = deque([root]) cnt = 0 while queue: node = queue.popleft() if node.left is None and node.right is None: cnt += 1 if node.left: queue.append(node.left) if node.right: queue.append(node.right) return cnt

20.3 数组下标直接计算

这是针对“完全二叉树存储在数组下标从 1 开始”的特殊实现:

def count_leaves_by_index(n): return n - n // 2

比如 n = 768:

print(count_leaves_by_index(768)) # 384

这种实现不构造树,只用数学关系,复杂度 O(1)。

21. 考试答题模板

如果你在简答题中需要写出解题过程,可以参考下面的模板:

  1. 设叶子结点数为 n0,度为 1 的结点数为 n1,度为 2 的结点数为 n2。
  2. 根据二叉树的性质,n0 = n2 + 1。
  3. 又因为该树是完全二叉树,所以 n1 只能为 0 或 1。
  4. 总结点数 768 = n0 + n1 + n2。
  5. 768 = n2 + 1 + n1 + n2 = 2 * n2 + n1 + 1。
  6. 若 n1 = 0,则 n2 = 383.5,不是整数,舍去。
  7. 若 n1 = 1,则 n2 = 383,n0 = 384。
  8. 所以该完全二叉树的叶子结点数为 384。

22. 总结与下一步

这道 2011 年考研 408 真题的核心考点只有两个:

  • 任意二叉树都有 n0 = n2 + 1。
  • 完全二叉树中度为 1 的结点数最多为 1。

已知总结点数为 768,偶数,可以迅速判断 n1 = 1,叶子结点数 n0 = 768 / 2 = 384。

建议收藏备用,然后继续刷同类变体题,特别是已知叶子结点数反推总结点数范围、已知层数和部分叶子结点数求总结点数这两类题目。掌握“奇偶性 + 度数关系”之后,这类选择题基本上 30 秒内就能出答案。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进