diff --git a/README.md b/README.md index 0727bd0..225d916 100644 --- a/README.md +++ b/README.md @@ -275,3 +275,20 @@ $$ - [nextval 数组](ch4/README.md#63-KMP-算法优化) ## 6. [树与二叉树](ch5/README.md#树与二叉树) + +- 二叉树 + - 二叉树的基本概念 + - 定义及特点 + - 二叉树的存储结构 + - 二叉树的遍历 + - 搜索二叉树 + - 二叉树的应用 + - 二叉排序树 + - 平衡二叉树 + - 哈夫曼树和哈夫曼编码 +- 树和森林 + - 树的基本概念 + - 树的存储结构 + - 树和森林的遍历 + - 树和森林及二叉树的转换 + - 树的应用:查并集 diff --git a/ch4/README.md b/ch4/README.md index 017cafd..4448744 100644 --- a/ch4/README.md +++ b/ch4/README.md @@ -11,7 +11,7 @@ $$ - $S$ 为串名。单引号(或双引号)括起来的字符序列是串的值。 - $a_{1}$ 可以是字母、数字或其他字符。 - 串中字符的个数 $n$ 为串的长度。 -- $n=0$ 时的串称为空串(用 $\varnothing$ 表示)。 +- $n=0$ 时的串称为空串(用 $\emptyset$ 表示)。 ### 1.1. 相关概念 @@ -244,7 +244,7 @@ int Index2(SString S, SString T) 改进思路:主串指针 $i$ 不回溯,只有模式串指针 $j$ 回溯。 -主串为 `googlgooglegooglo`,模式串为 `google`。如果 $j=k$ 时才发现匹配失败,说明 $1 \thicksim k-1$ 都匹配成功。 +主串为 `googlgooglegooglo`,模式串为 `google`。如果 $j=k$ 时才发现匹配失败,说明 $1 \sim k-1$ 都匹配成功。 - 若当前两个字符匹配,则 `i++`,`j++`。 - 若 $j=1$ 时发生不匹配,则应让 `i++`,而 $j$ 依然是 $1$。 @@ -335,7 +335,7 @@ $$ - 串的前缀:包含第一个字符,且不包含最后一个字符的字符串。 - 串的后缀:包含最后一个字符,且不包含第一个字符的字符串。 -当第 $j$ 个字符匹配失败,由前 $i \thicksim j-1$ 个字符组成的串记为 $S$,则: +当第 $j$ 个字符匹配失败,由前 $i \sim j-1$ 个字符组成的串记为 $S$,则: $$ next[j]=S的在最长相等前后缀长度+1 diff --git a/ch5/README.md b/ch5/README.md index a667ff7..acdf0ed 100644 --- a/ch5/README.md +++ b/ch5/README.md @@ -1 +1,62 @@ # 树与二叉树 + +## 1. 树的基本概念 + +树是 $n(n \geq 0)$ 个节点的有限集合,$n=0$ 时,称为空树。 + +而任意非空树应满足: + +1. 有且仅有一个特定的称为**根**的结点。 +2. 当 $n>0$ 时,其余结点可分为 $m(m \geq 0)$ 个互不相交的有限集合,其中每一个集合本身又是一棵树,称为根节点的**子树**。 + +$n$ 个结点的树中只有 $n-1$ 条边。 + +## 2. 基本术语 + +- 祖先结点和子孙结点 +- 双亲结点和孩子结点 +- 兄弟结点 +- (结点的)度:树中一个结点的**子结点的个数**称为该结点的度。 +- (树的)度:树中最大度数。 +- 分支结点:度大于 $0$ 的结点。 +- 叶子结点:度为 $0$ 的结点。 +- 结点的层次:根结点为第一层(或第零层)。 +- 结点的高度:从叶子结点(第一层)开始逐层累加。 +- 结点的深度:从根节点(第一层)开始逐层累加。 +- 树的高度(深度)是树中结点的最大层数。 +- 有序树和无序树 +- 路径:树中两个结点之间的路径是由这两个结点之间所经过的**结点序列**构成的。(树的分支是有向的,即从双亲结点指向孩子结点,所以路径一定是自上而下的。) +- 路径长度:路径上所经过**边**的个数。 +- 森林:$m(m \geq 0)$ 棵互不相交的树的集合。 + +![树的基本术语](tree.png) + +## 3. 树的性质 + +- 树中结点树等于所有结点的度加 $1$。 +- 度为 $m$ 的树中第 $i$ 层上至少有 $m^{i-1}$ 个结点($i \geq 1$)。 +- 高度为 $h$ 的 $m$ 叉树至多有 $(m^h-1)/(m-1)$ 个结点。 +- 具有 $n$ 个结点的 $m$ 叉树的最小高度为:$\left \lceil log_m(n(m-1)+1) \right \rceil$。 + +性质二说明: + +- 第一层:$1=m^0$ +- 第二层:$1=m^1$ +- 第三层:$1=m^2$ +- ... +- 第 $i$ 层:$1=m^{i-1}$ + +## 4. [二叉树](binary-tree/README.md#二叉树) + +### 4.1. [五种基本形态](binary-tree/README.md#1-五种基本形态) + +### 4.2. [二叉树 VS 度为 2 的有序树](binary-tree/README.md#2-二叉树-VS-度为-2-的有序树) + +### 4.3. [特殊二叉树](binary-tree/README.md#3-特殊二叉树) + +- [满二叉树](binary-tree/README.md#31-满二叉树) +- [完全二叉树](binary-tree/README.md#32-完全二叉树) +- [二叉排序树](binary-tree/README.md#33-二叉排序树) +- [平衡二叉树](binary-tree/README.md#34-平衡二叉树) + +### 4.4. [二叉树的性质](binary-tree/README.md#4-二叉树的性质) diff --git a/ch5/binary-tree/README.md b/ch5/binary-tree/README.md new file mode 100644 index 0000000..cc6e3d2 --- /dev/null +++ b/ch5/binary-tree/README.md @@ -0,0 +1,86 @@ +# 二叉树 + +二叉树是 $n(n \geq 0)$ 个结点的有限集合。 + +1. $n=0$ 时,二叉树为空。 +2. $n>0$ 时,由根节点和两个互不相交的被称为根的左子树和右子树组成。左子树和右子树也分别是一棵二叉树。 + +## 1. 五种基本形态 + +- 空树 +- 仅有根结点 +- 根节点+左子树 +- 根节点+右子树 +- 根节点+左子树+右子树 + +![二叉树的五种基本形态](five-basic-form-of-binary-tree.png) + +![三个结点的二叉树有多少种](binary-tree-with-3-nodes.png) + +## 2. 二叉树 VS 度为 2 的有序树 + +- 二叉树可以为空,而度为 2 的有序树至少有三个结点。 +- 二叉树的孩子结点始终有左右之分,而度为 2 的有序树孩子结点的次序是相对的。 + +![二叉树与度为2的有序树的区别](binary-tree-vs-ordered-tree-with-degree-2.png) + +## 3. 特殊二叉树 + +### 3.1. 满二叉树 + +一颗高度为 $h$,且含有 $2^h-1$ 个结点的二叉树称为满二叉树。(高度为 $h$ 的 $m$ 叉树至多有 $(m^h-1)/(m-1)$ 个结点。) + +对于编号为 $i$ 的结点,若存在,其双亲结点的编号为:$\left \lfloor i/2 \right \rfloor$,左孩子编号为:$2i$,右孩子编号为:$2i+1$。 + +![满二叉树](full-binary-tree.png) + +### 3.2. 完全二叉树 + +设一个高度为 $h$、有 $n$ 个结点的二叉树,当且仅当每个结点都与高度为 $h$ 的满二叉树中编号 $1 \sim n$ 的结点一一对应时,称为完全二叉树。 + +![完全二叉树](complete-binary-tree.png) + +- 若 $i<[n/2]$,则结点 $i$ 为分支结点,否则为叶子结点。 +- 叶子结点只可能出现在层次最大的两层上出现。对于最大层次的叶子结点,都依次排在最左边的位置上。 +- 度为 $1$ 的结点若存在,则可能有一个,且是编号最大的分支结点,并孩子结点一定是左节点。 + +![完全二叉树的性质](character-of-complete-binary-tree.png) + +### 3.3. 二叉排序树 + +一颗二叉树,若树非空,则有如下性质: + +对任意结点若存在左子树或右子树,则其左子树上所有结点的关键字均小于该节点。右子树上所有结点的关键字均大于该结点。 + +![二叉排序树](binary-sort-tree.png) + +### 3.4. 平衡二叉树 + +树上**任意结点**的左子树和右子树的深度之差不超过 $1$。 + +![平衡二叉树](balanced-binary-tree.png) + +## 4. 二叉树的性质 + +- 非空二叉树上的叶子结点数等于度为 $2$ 的节点数加 $1$,即 $n_0=n_2+1$ + +![二叉树性质一](nature-1-of-binary-tree.png) + +- 非空二叉树上第 $k$ 层上至多有 $2^{k-1}$ 个结点($k \geq 1$)。 +- 高度为 $h$ 的二叉树至多有 $2^h-1$ 个结点($h \geq 1$)。 + +![二叉树性质二和性质三](nature-2-and-3-of-binary-tree.png) + +- 对完全二叉树按从上到下、从左到右的顺序依次编号 $1,2,...,n$,则有以下关系: + - 当 $i>1$ 时,结点 $i$ 的双亲节点编号为:$\left \lfloor i/2 \right \rfloor$。即当 $i$ 为偶数时,其双亲结点的编号为 $i/2$,它是双亲结点的左孩子 0;当 $i$ 为奇数时,其双亲结点的编号的为 $(i-1)/2$,它是双亲结点的右孩子。 + - 当 $2i \leq n$ 时,结点 $i$ 的左孩子编号为 $2i$,否则无左孩子。 + - 当 $2i+1 \leq n$ 时,结点 $i$ 的右孩子编号为 $2i+1$,否则无右孩子。 + - 结点 $i$ 所在的层次为 $\left \lfloor log_2i \right \rfloor+1$。 + +![二叉树性质四](nature-4-of-binary-tree.png) + +![二叉树性质四2](nature-4-2-of-binary-tree.png) + +- 具有 $n$ 个($n>0$)结点的完全二叉树的高度为 $\left \lfloor log_2n+1 \right \rfloor$ 或 $\left \lceil log_2(n+1) \right \rceil$。 + +![二叉树性质五](nature-5-of-binary-tree.png) diff --git a/ch5/binary-tree/balanced-binary-tree.png b/ch5/binary-tree/balanced-binary-tree.png new file mode 100644 index 0000000..ebe3441 Binary files /dev/null and b/ch5/binary-tree/balanced-binary-tree.png differ diff --git a/ch5/binary-tree/binary-sort-tree.png b/ch5/binary-tree/binary-sort-tree.png new file mode 100644 index 0000000..72edc45 Binary files /dev/null and b/ch5/binary-tree/binary-sort-tree.png differ diff --git a/ch5/binary-tree/binary-tree-vs-ordered-tree-with-degree-2.png b/ch5/binary-tree/binary-tree-vs-ordered-tree-with-degree-2.png new file mode 100644 index 0000000..c54c30a Binary files /dev/null and b/ch5/binary-tree/binary-tree-vs-ordered-tree-with-degree-2.png differ diff --git a/ch5/binary-tree/binary-tree-with-3-nodes.png b/ch5/binary-tree/binary-tree-with-3-nodes.png new file mode 100644 index 0000000..188a155 Binary files /dev/null and b/ch5/binary-tree/binary-tree-with-3-nodes.png differ diff --git a/ch5/binary-tree/character-of-complete-binary-tree.png b/ch5/binary-tree/character-of-complete-binary-tree.png new file mode 100644 index 0000000..1adc9a0 Binary files /dev/null and b/ch5/binary-tree/character-of-complete-binary-tree.png differ diff --git a/ch5/binary-tree/complete-binary-tree.png b/ch5/binary-tree/complete-binary-tree.png new file mode 100644 index 0000000..e381b7c Binary files /dev/null and b/ch5/binary-tree/complete-binary-tree.png differ diff --git a/ch5/binary-tree/five-basic-form-of-binary-tree.png b/ch5/binary-tree/five-basic-form-of-binary-tree.png new file mode 100644 index 0000000..abea8aa Binary files /dev/null and b/ch5/binary-tree/five-basic-form-of-binary-tree.png differ diff --git a/ch5/binary-tree/full-binary-tree.png b/ch5/binary-tree/full-binary-tree.png new file mode 100644 index 0000000..81d8199 Binary files /dev/null and b/ch5/binary-tree/full-binary-tree.png differ diff --git a/ch5/binary-tree/nature-1-of-binary-tree.png b/ch5/binary-tree/nature-1-of-binary-tree.png new file mode 100644 index 0000000..6274275 Binary files /dev/null and b/ch5/binary-tree/nature-1-of-binary-tree.png differ diff --git a/ch5/binary-tree/nature-2-and-3-of-binary-tree.png b/ch5/binary-tree/nature-2-and-3-of-binary-tree.png new file mode 100644 index 0000000..efb9e45 Binary files /dev/null and b/ch5/binary-tree/nature-2-and-3-of-binary-tree.png differ diff --git a/ch5/binary-tree/nature-4-2-of-binary-tree.png b/ch5/binary-tree/nature-4-2-of-binary-tree.png new file mode 100644 index 0000000..2d2d172 Binary files /dev/null and b/ch5/binary-tree/nature-4-2-of-binary-tree.png differ diff --git a/ch5/binary-tree/nature-4-of-binary-tree.png b/ch5/binary-tree/nature-4-of-binary-tree.png new file mode 100644 index 0000000..4b4f429 Binary files /dev/null and b/ch5/binary-tree/nature-4-of-binary-tree.png differ diff --git a/ch5/binary-tree/nature-5-of-binary-tree.png b/ch5/binary-tree/nature-5-of-binary-tree.png new file mode 100644 index 0000000..adbb591 Binary files /dev/null and b/ch5/binary-tree/nature-5-of-binary-tree.png differ diff --git a/ch5/tree.png b/ch5/tree.png new file mode 100644 index 0000000..bdf35c9 Binary files /dev/null and b/ch5/tree.png differ