@@ -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