Skip to content

Commit 17b7a22

Browse files
committed
8.21 ds modify
1 parent a3597f0 commit 17b7a22

1 file changed

Lines changed: 56 additions & 0 deletions

File tree

docs/CS/data_structure/data_structure.md

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,62 @@ typedef struct {
461461
- 最小高度:$h = \lceil \log_3(100 \times 2 + 1) \rceil = \lceil \log_3(201) \rceil = 5$
462462
- 最大高度:$h = 100 - 3 + 1 = 98$
463463

464+
### 5.2 二叉树
465+
!!! abstract "二叉树定义"
466+
二叉树是一种特殊的树形结构,其特点是每个节点至多只有两棵保持左右顺序的子树。
467+
468+
!!! warning "二叉树和度为2的有序树的区别"
469+
- 度为2的树至少有3个结点,而二叉树可以为空
470+
- 度为2的有序树的孩子的左右次序是相对于另一个孩子而言的,而二叉树的左右子树是相对于父节点而言的
471+
472+
!!! info 几种特殊的二叉树
473+
- **满二叉树**: 高度为h,且有 $2^h - 1$ 个结点的二叉树,层序编号后,对于编号为i的结点,其左孩子编号为2i,右孩子编号为2i+1,其父亲编号为i/2(向下取整)。
474+
- **完全二叉树**: 高度为h,有n个结点的二叉树,当且仅当其每个结点都与满二叉树的结点一一对应时,称为完全二叉树。完全二叉树的特点是从左到右依次填充结点,最后一层可能不满。
475+
- 若i <= n/2(向下取整),则结点i为分支结点,否则为叶结点。
476+
- 叶结点只可能在层次最大的两层上出现,对于最大层次的叶结点,都依次排列在该层最左边的位置上。
477+
- 若有度为1的结点,则最多只可能有一个,且该节点只有左孩子而无右孩子。
478+
- 按层序编号后,一旦出现某结点(编号为i)为叶结点或只有左孩子,则编号大于i的结点均为叶结点。
479+
- 若n为奇数,则每个分支结点都有左孩子和右孩子,若n为偶数,则编号最大的分支结点(编号为n/2)只有左孩子而无右孩子。
480+
- 正则二叉树:树中每个分支结点都有2个孩子,即树中只有度为0或2的结点。
481+
482+
!!! info "二叉树的性质"
483+
- **性质1**: 非空二叉树上的叶结点数等于度为2的结点数加1,即
484+
$$ n_0 = n_2 + 1 $$
485+
其中n₀为叶结点数,n₂为度为2的结点数。(通过入度证明)
486+
- **性质2**: 非空二叉树的第k层最多有2^(k-1)个结点(k≥1)。
487+
- **性质3**: 高度为h的二叉树至多有 $2^h - 1$ 个结点(h≥1)。
488+
- **性质4**: 对完全二叉树按层序编号,有以下关系:
489+
- 若i<=n/2(向下取整),则结点i为分支结点,否则为叶结点,即最后一个分支结点的编号为n/2(向下取整)。
490+
- 叶结点只可能在层次最大的两层上出现。
491+
- 若有度为1的结点,则最多只可能有一个,且该节点只有左孩子而无右孩子。
492+
- 按层序编号后,一旦出现某结点(编号为i)为叶结点或只有左孩子,则编号大于i的结点均为叶结点。
493+
- 若n为奇数,则每个分支结点都有左孩子和右孩子,若n为偶数,则编号最大的分支结点(编号为n/2)只有左孩子而无右孩子。
494+
- 当i > 1时,结点i的双亲结点编号为i/2(向下取整)。
495+
- 若结点i有左右孩子,则左孩子编号为2i,右孩子编号为2i+1。
496+
- 结点i所在层次为k,则k = log₂i(向下取整) + 1。
497+
- **性质5**: 二叉树的高度h与结点数n的关系为
498+
$$ h = \lceil \log_2(n + 1) \rceil $$
499+
或者
500+
$$ h = \lceil \log_2(n) + 1 \rceil $$
501+
其中n为结点数。
502+
503+
### 5.3 二叉树的存储结构
504+
!!! abstract "二叉树存储结构"
505+
二叉树的存储结构主要有两种:顺序存储和链式存储。
506+
507+
- **顺序存储**: 采用数组存储二叉树,适用于完全二叉树。通过层序遍历将结点按顺序存入数组,空缺位置用NULL填充。优点是存取方便,缺点是浪费空间。
508+
- **链式存储**: 采用链表存储二叉树,每个结点包含数据域和左右孩子指针。适用于稀疏树,优点是节省空间,缺点是存取较慢。
509+
510+
````c
511+
typedef struct BiTNode {
512+
ElemType data; // 数据域
513+
struct BiTNode *lchild; // 左孩子指针
514+
struct BiTNode *rchild; // 右孩子指针
515+
} BiTNode, *BiTree;
516+
````
517+
518+
519+
464520
## ch6. 图
465521

466522
!!! todo "待完善内容"

0 commit comments

Comments
 (0)