目录
1. 二叉树的存储结构
顺序存储
- 定义:用一组连续的存储单元按从上到下、从左到右的顺序依次存储节点。
- 完全二叉树的特性:
- 编号为
i
的节点:- 双亲节点:
⌊i/2⌋
(若i > 1
)。 - 左孩子:
2i
(若2i ≤ n
)。 - 右孩子:
2i + 1
(若2i + 1 ≤ n
)。
- 双亲节点:
- 编号为
- 缺点:非完全二叉树需填充虚节点,导致空间浪费。
链式存储
- 二叉链表:节点包含
data
、lchild
(左孩子指针)、rchild
(右孩子指针)。 - 三叉链表:增加
parent
指针(指向双亲节点)。
2. 二叉树的遍历
- 深度优先遍历:
- 先序(根左右):如
1 2 4 5 7 8 3 6
。 - 中序(左根右):如
4 2 7 5 8 1 3 6
。 - 后序(左右根):如
4 8 7 5 2 6 3 1
。
- 先序(根左右):如
- 层次遍历:按层从左到右访问(如
1 2 3 4 5 6 7 8
)。 - 反向构造二叉树:
- 需中序 + 先序/后序序列才能唯一确定二叉树。
- 先序/后序定位根节点,中序划分左右子树。
真题示例:
一个高度为h的满二叉树的结点总数为2^h - 1,从根结点开始,自上而下、同层次结点从左至右,对结点按照顺序依次编号,即根结点编号为1,其左、右孩子结点编号分别为2和3,再下一层从左到右的编号为4,5,6,7,依此类推。那么,在一棵满二叉树中,对于编号为m和n的两个结点,若n = 2m + 1,则( )
A.m是n的左孩子 B.m是n的右孩子 C.n是m的左孩子 D.n是m的右孩子
- 若一个节点编号为
i
,其左孩子编号为2i
,右孩子编号为2i + 1
。 - 现在已知
n = 2m + 1
,这正好符合节点m
的右孩子编号的计算方式,所以n
是m
的右孩子。
某二叉树如图所示,若进行顺序存储(即用一维数组元素存储该二叉树中的结点且通过下标反映结点间的关系,例如,对于下标为i的结点,其左孩子的下标为2i、右孩子的下标为2i + 1),则该数组的大小至少为( );若采用三叉链表存储该二叉树(各个结点包括结点的数据、父结点指针、左孩子指针、右孩子指针),则该链表的所有结点中空指针的数目为( )。
A.6 B.10 C.12 D.15
A.6 B.8 C.12 D.14
顺序存储数组大小计算
- 对于顺序存储二叉树,要确定数组大小,需要考虑完全二叉树的情况(因为即使原二叉树不是完全二叉树,顺序存储也需要按照完全二叉树的方式预留空间)。
- 高度为4的完全二叉树节点总数为
2^4 - 1 = 15
个,所以数组大小至少为15
计算三叉链表中总的空指针数:1+2+1+2+2=8
空指针数 = 总的指针数 - 非空的父指针数 - 非空的孩子指针数,即18−5−5=8个。
3. 线索二叉树
ltag | lchild | data | rchild | rtag |
---|---|---|---|---|
用于标识左指针性质的标志位,ltag = 0 时,lchild 指向左孩子;ltag = 1 时,lchild 指向前驱 | 若 ltag = 0 ,指向当前节点的左孩子节点;若 ltag = 1 ,指向前驱节点 | 存储当前节点的数据 | 若 rtag = 0 ,指向当前节点的右孩子节点;若 rtag = 1 ,指向后继节点 | 用于标识右指针性质的标志位,rtag = 0 时,rchild 指向右孩子;rtag = 1 时,rchild 指向后继 |
- 目的:保留遍历时的前驱/后继信息,避免递归栈开销。
- 实现:
- 利用二叉链表中的空指针域(
n+1
个空指针):ltag=0
:lchild
指向左孩子;ltag=1
:指向前驱。rtag=0
:rchild
指向右孩子;rtag=1
:指向后继。
- 利用二叉链表中的空指针域(
4. 最优二叉树(哈夫曼树)
- 定义:带权路径长度最短的二叉树(权值大的节点靠近根)。
- 构造步骤:
- 选择权值最小的两个节点作为叶子,其和作为父节点。
- 重复合并直至所有节点用完。
- 应用:
- 哈夫曼编码:左分支标
0
,右分支标1
,编码无前缀冲突。
- 哈夫曼编码:左分支标
真题示例:
下表为某文件中字符的出现频率,采用霍夫曼编码对下列字符编码,则字符序列“bee”的编码为( );编码:“110001001101”的对应的字符序列( )
>字符 >a >b >c >d >e >f 频率(%) 45 13 12 16 9 5 A. 10111011101 B. 10111001100 C. 001100100 D. 110011011
A. bad B. bee C. face D. bace
a | b | c | d | e | f |
0 | 101 | 100 | 111 | 1101 | 1100 |
5. 查找二叉树(二叉排序树)
- 性质:
- 左子树节点值 < 根节点值 < 右子树节点值。
- 中序遍历结果为有序序列。
- 效率:取决于树的高度(平衡二叉树效率最高)。
6. 平衡二叉树(AVL树)
- 性质:
- 任意节点的左右子树高度差绝对值 ≤ 1。
- 平衡因子(BF)= 左高 - 右高,取值
-1
、0
、1
。
- 调整:通过旋转(左旋/右旋)恢复平衡。
真题示例:
某二叉树的先序遍历列为c a b f e d g,中序遍历序列为a b c d e f g,则二叉树是()。
A. 完全二叉树
B. 最优二叉树
C. 平衡二叉树
D. 满二叉树
对于节点c,其左子树高度为2(节点a和b),右子树高度为3(节点f、e和d ),高度差为1;对于节点f,左子树高度为2(节点e和d ),右子树高度为1(节点g),高度差为1。
设有二叉排序树(或二叉查找树)如下图所示,建立该二叉树的关键码序列不可能是()。
A. 23 31 17 19 11 27 13 90 61
B. 23 17 19 31 27 90 61 11 13
C. 23 17 27 19 31 13 11 90 61
D. 23 31 90 61 27 17 19 11 13
二叉排序树(二叉查找树)的特点是左子树的所有节点值小于根节点值,右子树的所有节点值大于根节点值。构建二叉排序树时,每个新节点都是从根节点开始比较大小确定插入位置。
- 选项C中,当插入
27
时,因为23 < 27
,27
应插入到23
的右子树。说明按照这个序列构建不出给定的二叉排序树。 - 选项A、B、D按照二叉排序树的插入规则都可以构建出给定的二叉排序树。