1. 二叉树
1.1 二叉树的性质
二叉树最基本的3条性质。不论是普通的二叉树还是完全二叉树,都满足以下三条。
-
第 iii 层上最多有 2i−12^{i-1}2i−1 个结点。
-
高度(深度)为 hhh 的二叉树,最多共有 2h−12^{h}-12h−1 个结点。
推导:1+2+⋯+2h−1=2h−11+2+\cdots+2^{h-1}=2^{h}-11+2+⋯+2h−1=2h−1. 等比数列求和:a1(1−qn)1−q\dfrac{a_{1}(1-q^{n})}{1-q}1−qa1(1−qn)
推论:高度(深度)为 hhh 的 k 叉树,最多共有 1+k+⋯+kh−1=kn−1k−11+k+\cdots+k^{h-1} =\dfrac{k^{n}-1}{k-1}1+k+⋯+kh−1=k−1kn−1 个结点 -
n0=n2+1n_{0}=n_{2}+1n0=n2+1
推导:设二叉树总的结点个数为nnn,则 n=n0+n1+n2n= n_{0}+n_{1}+n_{2}n=n0+n1+n2.
又除根节点外,每个结点头上都有一个分支,则结点总数 n=n=n=分支数+1+1+1,分支数 =0⋅n0+1⋅n1+2⋅n2= 0\cdot n_{0}+1\cdot n_{1}+2\cdot n_{2}=0⋅n0+1⋅n1+2⋅n2 ,即 n=n1+2n2+1n=n_{1}+2 n_{2}+1n=n1+2n2+1.
由以上两式,得 n0+n1+n2=n1+2n2+1n_{0}+n_{1}+n_{2}=n_{1}+2 n_{2}+1n0+n1+n2=n1+2n2+1,即 n0=n2+1n_{0}=n_{2}+1n0=n2+1.
1.2 两种特殊的二叉树
1.2.1 完全二叉树
完全二叉树的结点从上往下,从左往右,依次排列。
下图为完全二叉树:

下面两棵树不是完全二叉树:

由完全二叉树的定义可以推导出它的性质:
- nnn个结点的完全二叉树的高数(深度)h=⌊log2n⌋+1h=\lfloor \log_2n \rfloor+1h=⌊log2n⌋+1 或 h=⌈log2(n+1)⌉h=\lceil \log_2(n+1) \rceilh=⌈log2(n+1)⌉
推导:2k−1−1<n≤2k−12^{k-1}-1<n\leq 2^{k}-12k−1−1<n≤2k−1 - 第 iii 个结点如果有左孩子,则左孩子编号为 2i2i2i;
第 iii 个结点如果有右孩子,则左孩子编号为 2i+12i+12i+1; - 当 iii 为偶数时,第 iii 个结点的双亲结点的编号为 i2\dfrac{i}{2}2i;
当 iii 为奇数时,第 iii 个结点的双亲结点的编号为 i−12\dfrac{i-1}{2}2i−1;
综上,第 iii 个结点的双亲结点编号为⌊i2⌋\lfloor \dfrac{i}{2} \rfloor⌊2i⌋;
1.2.2 满二叉树
高度为 hhh 的二叉树的结点数为 2h−12^{h}-12h−1。

1.3 二叉树的存储结构
-
顺序存储

-
链式存储

若用静态链表存储该二叉树,则为:

掌握 给定存储结构能画出二叉树。
2. 二叉树的遍历和线索化
2.1 二叉树的遍历
- 二叉树的四种遍历

先序(根左右):- + a * b - c d / e f
中序(左根右):a + b * c - d - e / f
后序(左右根):a b c d - * + e f / -
对应的分别是 前缀表达式,中缀表达式,后缀表达式。
层序:- + / a * e f b - c d,层序遍历需要借助队列。
- 由遍历序列确定二叉树
中序 + 前序 / 后序 可以确定一棵二叉树。
(1)先序+中序


(2)中序+后序


- 两种遍历序列相同的特殊二叉树


2.2 二叉树的线索化
线索二叉树的结点结构:

二叉树的每个结点都有两个指针(lchild,rchild),若结点有左右孩子,则左右指针分别指向左右孩子;若没有左(右)孩子,可以将左(右)指针指向 前序(后继)结点,方便查找前驱(后继)。
为了区别指针指的是左右孩子还是前驱后继,增加两个标志域 ltag 和 rtag 用于区分。

等于 0 说明指向孩子,等于 1 的说明指向前驱 / 后继。
将每个结点的空指针指向结点的前驱 / 后继的过程叫做二叉树的线索化。
三种不同的遍历产生三种不同的序列,结点在不同遍历序列中的前驱后继不同。因此,依据遍历序列的不同将线索化分为三种:先序线索化,中序线索化,后序线索化。



3. 哈夫曼树
3.1 度为2的哈夫曼树(最优二叉树)
哈夫曼树中权值越大的结点越靠上(重要的结点更容易找到),权值越小的结点越靠下。结点的孩子可以相互交换,不影响带权路径长度,因此哈夫曼树不唯一。
度为 2 的哈夫曼满足二叉树的性质。
哈夫曼树带权路径最小,且唯一。
哈夫曼树(度为2)只有度为 0 和度为2的结点,即 n1=0n1=0n1=0。
含字符的结点在哈夫曼树中都是叶子结点。



3.2 哈夫曼编码
哈夫曼编码是前缀编码,前缀编码没有前缀。例如:

B 中 0 是 00 的前缀,1 是 11 的前缀,不是前缀编码;A,C,D是前缀编码。
哈夫曼编码按照哈夫曼树进行构造,规则是 “左0右 1”。



3.3 度为 m 的哈夫曼树(最优m叉树)

对于 mmm 个权值,建 kkk 叉树,若 (m−1)%(k−1)=0(m-1)\%(k-1)=0(m−1)%(k−1)=0,则第一次合并时将 kkk 个权值进行合并;
若 (m−1)%(k−1)≠0(m-1)\%(k-1)\neq0(m−1)%(k−1)=0,则第一次合并时将 (m−1)%(k−1)+1(m-1)\%(k-1)+1(m−1)%(k−1)+1 个权值进行合并。

4. 树和森林
树的存储有顺序存储结构和链式存储结构。
顺序存储结构:双亲表示法;
链式存储结构:孩子表示法,孩子兄弟表示法;
4.1 树的存储结构
-
双亲表示法
用数组存储每个结点,和其双亲结点在数组中的下标。

-
孩子表示法
将每个结点及其孩子结点用单链表链接起来。n 个结点就有 n 个孩子链表。

-
孩子兄弟表示法
孩子兄弟表示法 又称 二叉树表示法,用二叉链表存储树。每个结点有三部分:结点值,指向第一个孩子结点的指针,指向下一个兄弟结点的指针,简称为 “左孩子,右兄弟”。

4.2 树 / 森林与二叉树的转换
规则:“左孩子,右兄弟”。

4.3 树的的遍历

树的后根遍历对应二叉树的中序遍历。
本文详细介绍了二叉树的基本性质、完全二叉树和满二叉树的特点,以及二叉树的存储结构和遍历方法,包括先序、中序、后序和线索化。此外,还讨论了哈夫曼树的构建和编码,以及树和森林的存储方式和转换规则。

459

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



