二叉树的概念、性质与存储
教材在
这一节还有一条容易被跳过但很值钱的线:二叉树与「度为 2 的有序树」不是一回事。这个区分决定了 5.4.2 树与二叉树的转换 为什么必须规定「左孩子右兄弟」而不能随便对应。
机制
定义与 5 种基本形态
二叉树是一种特殊的树形结构,其特点是每个结点至多只有两棵子树(二叉树中不存在度大于 2 的结点),并且二叉树的子树有左右之分,其次序不能任意颠倒。
递归定义:二叉树是
5 种基本形态:空二叉树、只有根结点、只有左子树、左右子树都有、只有右子树。
二叉树 ≠ 度为 2 的有序树
| # | 区别 |
|---|---|
| ① | 度为 2 的树至少有 3 个结点,而二叉树可以为空 |
| ② | 度为 2 的有序树的孩子的左右次序是相对于另一个孩子而言的,若某个结点只有一个孩子,则这个孩子无须区分左右次序;而二叉树无论其孩子数是否为 2,均需确定其左右次序,即二叉树的结点次序不是相对于另一结点而言的,而是确定的 |
边界辨析:
区别 ② 才是本质。 一棵只有一个孩子的树,在「有序树」里那个孩子就是「第一个孩子」,没有左右可言; 在二叉树里它必须明确是左孩子还是右孩子,两种情况是两棵不同的二叉树(教材图 5.15 就是这一对)。 这正是 5.3.1 里「先序
+ 后序 无法唯一确定一棵二叉树」的根源。
几种特殊的二叉树
| 名称 | 定义 |
|---|---|
| 满二叉树 | 高度为 |
| 完全二叉树 | 高度为 |
| 二叉排序树 | 见 7.3.1 |
| 平衡二叉树 | 任意结点左右子树高度差绝对值 |
| 正则二叉树 | 树中每个分支结点都有 2 个孩子,即树中只有度为 0 或 2 的结点 |
完全二叉树可视为从满二叉树中删去若干最底层、最右边的一些连续叶结点后所得到的二叉树(教材脚注)。
二叉树的性质
1)非空二叉树上的叶结点数等于度为 2 的结点数加 1,即
证明:设度为
2)非空二叉树的第
3)高度为
关联对照:
教材注意框:性质 2 和性质 3 还可以拓展到
叉树—— 叉树的第 层最多有 个结点, 高度为 的 叉树至多有 个结点。 这两条就是 5.1.3 的性质 2 和性质 3。 两节的公式是同一套,不必分开记。
4)完全二叉树按层序编号
| # | 结论 |
|---|---|
| ① | 最后一个分支结点的编号为 |
| ② | 叶结点只可能在最后两层上出现(当减少 2 个或以上叶结点时,次底层将出现叶结点) |
| ③ | 若有度为 1 的结点,则最多只可能有一个,且该结点只有左孩子而无右孩子,其结点编号为 |
| ④ | 按层序编号后,一旦出现某结点(如编号 |
| ⑤ | 若 |
| ⑥ | 当 |
| ⑦ | 若结点 |
| ⑧ | 结点 |
5)具有
边界辨析:
③ 和 ⑤ 是同一件事的两种说法,也是最常被单独考的一条: 完全二叉树里度为 1 的结点最多一个,而且只能是左孩子。 由此推出:
为奇数 ; 为偶数 。 与 联立,就能由 直接算出 ——这是最快的解题路线。
存储结构
1. 顺序存储:用一组连续的存储单元依次自上而下、自左至右存储完全二叉树上的结点元素,即将完全二叉树上编号为
- 完全二叉树和满二叉树采用顺序存储比较合适,结点的序号可以唯一地反映结点之间的逻辑关系。
- 但对于一般的二叉树,为了让数组下标能反映逻辑关系,只能添加一些并不存在的空结点。最坏情况下,一个高度为
且只有 个结点的单支树却需要占据近 个存储单元。 - 教材注意框:「建议从数组下标 1 开始存储树中的结点,保证数组下标和结点编号一致。」
2. 链式存储(二叉链表):每个结点含 data、lchild、rchild 三个域。
在含
推导(教材在 5.3.2 给出):每个叶结点都有 2 个空指针,每个度为 1 的结点都有 1 个空指针,空指针总数为
这
手算模板
由
奇 ; 偶 。 - 代入
与 。 - 解得:
奇时 ; 偶时 。
由编号定位:双亲
边界
| 说法 | 判断 | 说明 |
|---|---|---|
| 「二叉树就是度为 2 的有序树」 | ❌ | 二叉树可以为空,且左右次序是绝对的而非相对的 |
| 「二叉树中一定存在度为 2 的结点」 | ❌ | 单支树全是度为 1 的结点 |
| 「 | ❌ | 只对二叉树。一般树要用三式联立 |
| 「正则二叉树就是满二叉树」 | ❌ | 正则只要求没有度为 1 的结点,形状可以很不规则 |
| 「完全二叉树的叶结点都在最后一层」 | ❌ | 只可能在最后两层 |
| 「完全二叉树中度为 1 的结点可以有多个」 | ❌ | 最多一个,且只有左孩子 |
| 「结点 | ⚠️ | 只在完全二叉树且下标从 1 开始时成立 |
| 「一般二叉树适合顺序存储」 | ❌ | 最坏 |
| 「 | ❌ | |
| 「高度为 | ✅ | 单支树 |
口径差异:
算竞里线段树、堆用的都是「下标从 1 开始、左儿子
」的写法,这一点两边完全一致,是本节唯一可以直接迁移的经验。 但**「完全二叉树」的定义两边不同**:算竞里常把「除最后一层外都满、最后一层靠左」当作定义(结果一样), 而 408 的定义是「与同高度满二叉树编号 一一对应」——考的正是用编号做推理(性质 4 的八条), 不是判断形状。
对照速查
| 性质 | 结论 |
|---|---|
| 叶与度 2 | |
| 第 | |
| 高度 | |
| 完全二叉树高度 | |
| 二叉链表空链域 | |
| 最后一个分支结点 |
| 奇数 | 0 | |
| 偶数 | 1 |
| 存储方式 | 适合 | 代价 |
|---|---|---|
| 顺序 | 完全 / 满二叉树 | 一般二叉树最坏 |
| 二叉链表 | 一般二叉树 |
考点
(教材明说「牢记并灵活应用」)。 - 完全二叉树的八条编号性质(2009、2011、2018 命题追踪)。
- 由
的奇偶判 ,再求 。 - 二叉树与度为 2 的有序树的两点区别。
- 正则二叉树的树高与结点数关系(2016 命题追踪)。
- 一般二叉树顺序存储的空间浪费(2020 命题追踪)。
- 二叉链表有
个空链域——线索二叉树的入口。
链接
- 🏠 返回总览:数据结构第 5 章:树与二叉树总览
- ⬅️ 上一节:5.1 树的基本概念
- ➡️ 下一节:5.3.1 二叉树的遍历
- 🔗
个空链域的用途:5.3.2 线索二叉树 - 🔗 二叉排序树与平衡二叉树:7.3.1、7.3.2
- 📖 名词库:第 5 章名词库