数据结构复习--树

树和二叉树

内容提纲

  • 树的概念
  • 二叉树的概念
  • 二叉树的存储结构
  • 二叉树基本运算及其实现
  • 二叉树的遍历
  • 二叉树的构造
  • 线索二叉树
  • 哈夫曼树
  • 杂项

树的概念

树的定义

形式化定义:

对于树:T={D, R},D是包含n个结点的有限集合,当n=0时为空树,否则关系R满足以下条件:

  • 有且仅有一个根节点
  • 除根节点之外,每个节点有且仅有一个前驱结点
  • 每个节点可以有零个或者多个后继结点

递归定义:

树是由n个结点组成的有限集合,其中:

  • 如果n=0,则其为空树
  • 如果n>0,则存在唯一一个根节点,该根节点的每一个孩子节点又作为一棵子树的根节点。

树的(逻辑)表示方法

  • 树型表示法
  • 文氏图表示法
  • 凹入表示法
  • 括号表示法

树的一些性质

  • 树中的节点数=所有节点的度数之和+1
  • 度为m的树中第i层上至多有 m i − 1 m^{i-1} mi1个节点
  • 高度为h的m次树至多有 m h − 1 m − 1 \frac {m^h-1}{m-1} m1mh1个节点
  • 有n个节点的m次树的最小高度为 ⌈ \lceil log ⁡ m ( n ( m − 1 ) + 1 ) \log_m(n(m-1)+1) logm(n(m1)+1) ⌉ \rceil

树的基本运算

  • 查找
    • 先根遍历
    • 后根遍历
    • 层次遍历
  • 插入或删除
  • 遍历

树的存储结构

  • 双亲存储结构
  • 孩子链存储结构
  • 孩子兄弟链存储结构

二叉树的概念

二叉树的定义

二叉树是有限的节点的集合:

  • 集合为空
  • 集合由一个根节点和两个互不相交的左右子二叉树组成

二叉树的(逻辑)表示方法:

同树

二叉树和二次树的区别

  • 二叉树是有序的
  • 二叉树包括空树

特殊的二叉树

  • 满二叉树
    • 所有分支节点都是双分支节点
    • 所有叶节点都集中在二叉树的最下一层
  • 完全二叉树
    • 最多只有下面两层的节点度数小于2
    • 最下面一层的叶节点都依次排列在最左边的位置上

二叉树的性质:

  • 所有二叉树的性质
    • 具有所有树的性质
    • 非空二叉树叶节点数=双分支节点数+1
  • 完全二叉树的性质
    • 具有所有二叉树的性质
    • 度为1的节点数为1(n为偶数)或1(n为奇数)
    • 若i ≤ ⌊ n / 2 ⌋ \leq\lfloor{n/2}\rfloor n/2,则编号为i的节点为分支节点,否则为叶节点
    • 除根节点外,若一个节点的编号为i,则它的双亲结点编号为 ⌊ i / 2 ⌋ \lfloor{i/2}\rfloor i/2

二叉树与树、森林之间的转化

  1. 森林、树转化为二叉树

    1. 在所有相邻兄弟节点(森林中每棵树的根节点可看成是兄弟节点)之间加一水平连线
    2. 对每个非叶节点k,除了其最左边的孩子节点外,删去k与其他孩子节点的连线
  2. 二叉树还原为森林、树

    1. 对于二叉树的某一个节点k,链接k与k的左孩子的所有右孩子节点,删去k的左孩子与右孩子节点之间的连线
    2. 若根节点有右孩子节点,将其分成两个不同的子树。

二叉树的存储结构

顺序存储结构

为了简便,我们不用下标为0的元素

若为完全二叉树,则将节点按层序编号

若为非完全二叉树,将其补全后(可以利用特殊符号填补空缺)再按层序标号

二叉树的链式存储结构

节点的类型定义:

typedef ElemType int;
typedef struct node
{
    ElemType data;
    struct node *lchild, *rchild;
}BTNode;

在n个节点的二叉链中,空指针的个数=n+1


二叉树的基本运算及其实现

  • 创建二叉树
  • 销毁二叉链存储结构
  • 查找结点
  • 找孩子节点
  • 求高度
  • 输出二叉树

二叉树的遍历

  • 递归遍历方法
    • 先序遍历
    • 中序遍历
    • 后序遍历
  • 层次遍历

二叉树的构造

已知二叉树的序列中的两个

  • 可以唯一的确定二叉树:
    • 先序序列和中序序列
    • 中序序列和后续序列
  • 不能唯一的确定二叉树
    • 先序序列和后续序列

可以唯一确定二叉树的原因为:

可以根据先序/后序确定根节点,从而在中序中找出根节点以及左子树和右子树,往下递归即构造出二叉树


线索二叉树

很是懵逼


哈夫曼树

定义

  • 带权路径长度:从根节点到各个叶节点的路径长度与相应节点权值的乘积的和
  • 哈夫曼树(最优树):最有最小带权路径长度的二叉树

构造:

  • 哈夫曼树的构造原则:
    • 权值越大的叶节点越靠近根节点
    • 权值越小的叶节点越远离根节点
  • 哈夫曼树的构造过程(若有n个节点):
    1. 构造n棵只有一个叶节点的二叉树,得到二叉树集合T
    2. 在T中选取根节点权值最小的两棵二叉树作为左、右子树构造一棵新的二叉树,根节点的权值为其左、右子树根节点的权值之和
    3. 在集合T中删除左、右子树,并将新构造的二叉树加入到集合中
    4. 重复2,3直到T中只剩下一棵二叉树,此即哈夫曼树

哈夫曼树的特点:

  • 没有单分支节点
  • n=2 n 0 n_0 n0-1

哈夫曼编码

  • 哈夫曼编码属于0、1二进制编码
  • 规定哈夫曼树中的左分支为0,右分支为1
  • 叶节点对应的字符编码用从根节点到该叶节点所经过的分支对应的0、1序列表示
  • 哈夫曼编码的特点:
    • 权值越大的字符编码越短,反之越长
    • 一组哈夫曼编码中,一个字符的哈夫曼编码不可能是另一个字符哈夫曼编码的前缀
    • 哈夫曼编码也成为前缀编码

杂项

  • n个不同的节点构造的二叉树个数为Catalan数: C 2 n n n + 1 \frac{C_{2n}^{n}}{n+1} n+1C2nn

  • n个节点并且高度为n的不同形态的二叉树个数为: 2 n − 1 2^{n-1} 2n1

  • 二叉树中节点的计算办法:

    • 二叉树中所有节点的度 ≤ 2 \leq2 2
    • 分支数=所有节点度之和=n-1
    • n = n 0 + n 1 + n 2 = n 1 + 2 n 2 + 1 n=n_0+n_1+n_2=n_1+2n_2+1 n=n0+n1+n2=n1+2n2+1
  • 二叉树中节点的计算方法

    • 节点个数为n,树型可以唯一确定
    • 叶子节点个数为 n 0 n_0 n0,树型不能唯一确定
    • 高度 h = ⌈ l o g 2 ( n + 1 ) ⌉ h=\lceil{log_2(n+1)}\rceil h=log2(n+1),是n个节点高度最小的二叉树
  • 二叉树的构造:

    • 由中序序列和先序序列可以唯一的构造一棵二叉树
    • 由中序序列和后序序列可以唯一的构造一棵二叉树
    • 由中序序列和层次序列可以唯一的构造一棵二叉树
  • 由一个固定的先序序列(含有n个不同的节点),构造的二叉树个数为: C 2 n n n + 1 \frac{C_{2n}^{n}}{n+1} n+1C2nn

  • 例题:

    • 一棵度为10,节点个数为n的树采用孩子链存储结构时,其中非空指针域数占总指针域数的比例为:10%
    • 在树的孩子兄弟链存储结构中,有6个空的左指针域,7个空的右指针域,5个节点左、右指针域都为空,则该树中叶子节点个数为:6(等于左指针域为空的个数)
    • 有一棵三次数,其中 n 3 = 2 , n 2 = 2 , n 1 = 1 n_3=2,n_2=2,n_1=1 n3=2,n2=2,n1=1,当该树采用孩子兄弟链存储结构时,其中非空指针域数占总指针域数的比例约为:45%
    • 设F是一个森林,B是F变换的二叉树。若F中有m个分支节点,则B中右指针域为空的节点有m+1个
    • 一棵有124个叶子节点的完全二叉树最多的节点数为:248
    • 若二叉树采用二叉链存储结构,如果要交换其所有分支节点左、右子树的位置,利用:后序遍历方法
    • 某二叉树的先序序列和后序序列正好相反,则该二叉树一定是:高度等于其节点数

你可能感兴趣的:(C)