前言
最害怕的数据结构之一——树,另一个是图。主要是当时递归和链表没学好,遍历或插入的时候总是思路不清,一堆的段错误。但是这两个数据结构在机器学习里有着重要的作用。
树这一数据结构,主要常用的就是二叉树、哈夫曼编码等。
树的定义和基本术语
树是n个结点的有限集,示例图如下:
对树而言常见的概念有:
- 节点深度:对任意节点x,x节点的深度表示为根节点到x节点的路径长度。所以根节点深度为0,第二层节点深度为1,以此类推。
【也有一些教材认为根节点深度为0】 - 节点高度:对任意节点x,叶子节点到x节点的路径长度就是节点x的高度
- 树的深度:一棵树中节点的最大深度就是树的深度,也称为高度
- 父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点
- 子节点:一个节点含有的子树的根节点称为该节点的子节点
节点的层次:从根节点开始,根节点为第一层,根的子节点为第二层,以此类推 - 兄弟节点:拥有共同父节点的节点互称为兄弟节点
- 度:节点的子树数目就是节点的度
- 叶子节点:度为零的节点就是叶子节点
- 祖先:对任意节点x,从根节点到节点x的所有节点都是x的祖先(节点x也是自己的祖先)
- 后代:对任意节点x,从节点x到叶子节点的所有节点都是x的后代(节点x也是自己的后代)
- 森林:m颗互不相交的树构成的集合就是森林
二叉树
二叉树是另一种树形结构,它的特点是每个结点至多只有两颗子树,且子树有左右之分,次序不能任意颠倒。
二叉树的性质
性质1:在二叉树的第
i
i
i层最多有
2
i
−
1
2^{i-1}
2i−1个结点。
性质2:深度为
k
k
k的二叉树最多有
2
k
−
1
2^{k}-1
2k−1个结点。
性质3:对任何一棵二叉树T,如果中断结点数为
n
0
n_0
n0,度为2的结点数为
n
2
n_2
n2,则
n
0
=
n
2
+
1
n_0=n_2+1
n0=n2+1
性质4:具有
n
n
n个结点的完全二叉树的深度为
⌊
l
o
g
2
n
⌋
\lfloor log_2n \rfloor
⌊log2n⌋+1
二叉树的存储
常用的存储方式是链式存储结构,二叉链表至少包含3个域:数据域data、左指针域lchild和右指针域rchild,若下图所示:
遍历二叉树
先序遍历:根-左-右
中序遍历:左-根-右
后续遍历:左-右-根
按照根节点的访问来确定是哪一种遍历方式
线索二叉树
对于n个结点的二叉树,在二叉链存储结构中有n+1个空链域,利用这些空链域存放在某种遍历次序下该结点的前驱结点和后继结点的指针,这些指针称为线索,加上线索的二叉树称为线索二叉树。
树和森林
树的存储结构
-
双亲表示法
以双亲作为索引的关键词的一种存储方式,每个结点只有一个双亲,所以选择顺序存储占主要。以一组连续空间存储树的结点,同时在每个结点中,附设一个指示其双亲结点位置的指针域
-
孩子表示法
由于每个结点可有多个子树(无法确定子树个数),可以考虑使用多重链表来实现。
-
孩子兄弟表示法
赫夫曼树及其应用
赫夫曼树又称为最优树,是一类带权路径长度最短的树,在构建赫夫曼树时可以借助贪心算法和最小堆来构成。
总结
比较笼统的复习了一下有关树的知识,其中最重要的就是二叉树和赫夫曼树。
QAQ
不想回校