树知识
1、树
- 定义:树(tree)是n(n>0)个结点的有限集T,其中:
-
- 有且仅有一个特定的结点,称为树的根(root)
-
- 当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,……Tm,其中每一个集合本身又是一棵树,称为根的子树(subtree)
- 特点:
-
- 树中至少有一个结点——根
-
- 树中各子树是互不相交的集合
- 树中各子树是互不相交的集合
- 基本术语
-
- 结点(node):指树中的一个数据元素,包括数据项及若干指向其子树的分支。一般用一个字母表示。
-
- 结点的度(degree)——结点拥有的子树数
-
- 叶子(leaf)——度为0的结点,也叫终端结点。
-
- 分枝结点——除叶子结点外的所有结点,也叫非终端结点。
-
- 孩子(child)——结点子树的根称为该结点的孩子
-
- 双亲(parents)——孩子结点的上层结点叫该结点的~
-
- 祖先结点——从根结点到该结点所经过分枝上的所有结点为
-
- 该结点的祖先,如图6-1c中M的祖先有A,D ,H 。
-
- 子孙结点——某一结点的子女及子女的子女都为该结点子孙。
-
- 兄弟(sibling)——具有同一个双亲的结点
-
- 树的度——一棵树中最大的结点度数
-
- 结点的层次(level)——从根结点算起,根为第一层,它的孩子为第二层……
-
- 深度(depth)——树中结点的最大层次数
-
- 有序树——若一棵树中所有子树从左到右的排序是有顺序的,不能颠倒次序。称该树为有序树。
-
- 无序树——若一棵树中所有子树的次序无关紧要,则称为无序树。
-
- 森林(forest)——m( m ≧ 0 m\geqq0 m≧0)棵互不相交的树的集合.一棵树可以看成是一个特殊的森林。
4. 树的其他表示
5. 树的存储结构
- 双亲表示法
- 孩子表示法:多重链表:每个结点有多个指针域,分别指向其子树的根
任一数据元素,有0个或多个孩子;
因此可以设计一个链式存储结构,其结点除放置数据元素外,还可以放置若干指针,分别用来指示该结点的所有孩子结点在存储空间中的位置。
法3.
- 带双亲的孩子链表
- 孩子兄弟表示法(二叉树表示法)
2、二叉树
- 定义:二叉树是n(n0)个结点的有限集,它或为空树(n=0),或由一个根结点和两棵分别称为左子树和右子树的互不相交的二叉树构成。
- 特点
-
- 每个结点至多有二棵子树(即不存在度大于2的结点)
-
- 二叉树的子树有左、右之分,且其次序不能任意颠倒
- 基本形态
- 性质:
(1)在二叉树的第i层上至多有 2 i − 1 2^{i-1} 2i−1个结点(i≥1)
(2)深度为k的二叉树至多有 2 k − 1 2^{k-1} 2k−1个结点(k≥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 - 几种特殊形式的二叉树:
(1)满二叉树:
(A)定义:一棵深度为k且有
2
k
−
1
2^k-1
2k−1个节点的二叉树称为满二叉树
(B)特点:每一层上的节点数都是最大节点树
(2)完全二叉树
(A) 定义:深度为k,有n个结点的二叉树当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时,称为完全二叉树
(B) 特点:
(a)叶子结点只可能在层次最大的两层上出现
(b)对任一结点,若其右分支下子孙的最大层次为 L,则其左分支下子孙的最大层次必为 L 或 L +1
(C)性质:具有n个节点的完全二叉树的深度为
6. 二叉树的存储结构
(1)采用顺序存贮结构,实际要求对非线性的结构线性化。
按满二叉树的结点层次编号,依次存放二叉树中的数据元素
- 节点间关系蕴含在其存储位置中
- 浪费空间,始于存满二叉树和完全二叉树
(2)二叉树的链式存储结构
(3)静态链表
上面们二叉链表或三叉链表是用指针实现,是一种动态的链式存储结构,链式存储结构也可用一维数组来实现,用一维数组表示的二叉链表或三叉链表,称为静态链表。
7. 二叉树的遍历
(1)遍历——按一定规律走遍树的各个顶点,且使每一顶点仅被访问一次,即找一个完整而有规律的走法,以得到树中所有结点的一个线性排列
(2)由二叉树的递归定义,二叉树的三个基本组成单元是:根结点、左子树和右子树。
(3)二叉树的遍历可以分解为:访问根,遍历左子树和遍历右子树
(4)方法
-
- 先序遍历:先访问根结点,然后分别先序遍历左子树、右子树
- 先序遍历:先访问根结点,然后分别先序遍历左子树、右子树
-
- 中序遍历:先中序遍历左子树,然后访问根结点,最后中序遍历右子树
- 中序遍历:先中序遍历左子树,然后访问根结点,最后中序遍历右子树
-
- 后序遍历:先后序遍历左、右子树,然后访问根结点
- 后序遍历:先后序遍历左、右子树,然后访问根结点
-
- 按层次遍历:从上到下、从左到右访问各结点
(5)根据序列创建二叉树
- 线索二叉树
(1)定义:
- 前驱与后继:在二叉树的先序、中序或后序遍历序列中两个相邻的结点互称为~
- 线索:指向前驱或后继结点的指针称为~
- 线索二叉树:加上线索的二叉链表表示的二叉树叫~
- 线索化:对二叉树按某种遍历次序使其变为线索二叉树的过程叫~
(2)实现: - 在有n个结点的二叉链表中必定有n+1个空链域
- 在二叉树或二叉链表中,若左孩子为空,则画出它的直接前驱,右孩子为空时,则画出它的直接后继,左右孩子不为空时,不需画前驱和后继。这样就得到了线索二叉树或线索二叉链表。
树!P97
3、树转换成二叉树
4、二叉树转换成树
5、森林转换成二叉树
6、二叉树转换成森林
7、哈夫曼树及其应用
- 哈夫曼树:带权路径长度最短的树
- 哈夫曼树的存储表示
- 构造哈夫曼树的方法——哈夫曼算法