1.树的定义和基本术语
树是n个结点的有限集。在任意一颗非空树中:(1)有且仅有一个特定的根(root)的结点;(2)当n>1时,其余结点可分为m个互补相交的有限集T1,T2...Tm,
其中每一个集合本身又是一棵树,并且称为根的子树。
树的结点包含一个数据元素及若干指向其子树的分支。结点拥有的子树数称为结点的度。度为0的结点称为叶子或终端结点。度不为0的节点称为非终端结点或
分支结点。除根结点以外,分支结点也称为内部结点。树的度是树内各结点的度的最大值。结点的子树的根称为该结点的孩子,相应的,该结点称为孩子的双亲。
同一个双亲的孩子之间互称为兄弟。结点的祖先是从根到该结点所经分支上的所有结点。相反,以某结点为根的子树中的任一结点都称为该结点的子孙。
结点的层次从根结点开始定义起,根为第一层,根的孩子为第二层。若某结点在第l层,则其子树的根就在l+1层。其双亲在同一层的结点互为堂兄弟。树中结点
的最大层次称为树的深度或高度。
如果将树中结点的各子树看成从左到右是有序的(即不能互换),则称该树为有序树,否则称为无序树。在有序树中最左边的子树的根称为第一个孩子,最右边的
称为最后一个孩子。
森林是m棵互不相交的树的集合。对树中每个结点而言,其子树的集合即为森林。由此,也可以森林和树互相递归的定义来描述树。
2.二叉树
二叉树:每个结点至多只有两颗子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒。
二叉树的性质:
1.在二叉树的第i层上至多有2^(i-1) 个结点(i>=1)
2.深度为k的二叉树至多有 (2^k - 1) 个结点
3.任何一颗二叉树T,如果其终端结点树为n0,度为2的结点数为n2,则 n0 = n2 + 1
满二叉树:一颗深度为k,且结点数为(2^k - 1)个结点的二叉树称为满二叉树。这种树的特点是每一层上的结点数都是最大结点数(2^(i-1))。
可以对满二叉树的结点进行编号,约定编号从根结点开始,自上而下,自左至右,由此可以引出完全二叉树的定义。深度为k的,有n个结点的二叉树,当且仅当其每一个
结点都与深度为k的满二叉树中编号从1至n的结点一一对应于时,称之为完全二叉树。这种树的特点是:1.叶子结点只可能在层次最大的两层上出现;2.对任一结点,若其
右分支下的子孙的最大层次为l,则其左分支下的子孙的最大层次必为l或l+1。
完全二叉树的两个重要特性:
4.具有n个结点的完全二叉树的深度为 |log2^n| + 1
5.如果对一颗有n个结点的完全二叉树(其深度为 |log2^n| + 1)的结点按层次序编号(从第1层到第 |log2^n|+1 层,每层从左到右),则对任意结点i,有:
1) 如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则其双亲PARENT(i)是结点[i/2]
2) 如果2i>n,则结点i无左孩子(结点i为叶子结点);否则左孩子LCHILD(i)是结点2i
3) 如果2i+1>n,则结点i无右孩子;否则其右孩子RCHILD(i)是结点 2i+1
3.遍历二叉树和线索二叉树
在二叉树的应用中,常常要求在树中查找具有某种特征的结点,这就需要遍历二叉树。
二叉树是由3个基本单元组成的:根节点,左子树和右子树。因此,若能依次遍历这三部分,便是遍历了整个二叉树。假如以L,D,R 分别表示遍历左子树,右子树,和根节点,
则可以有DLR,LDR,LRD,DRL,RDL,RLD 这6种遍历二叉树的方式。若限定先左后右,则只有前3种情况,分别称之为先(根)序遍历,中(根)序遍历和后(根)序遍历。
1.先序遍历
1)访问根结点
2)先序遍历左子树
3)后序遍历右子树
2.中序遍历
1)中序遍历左子树
2)访问根结点
3)中序遍历右子树
3.后序遍历
1)后序遍历左子树
2)后序遍历右子树
3)访问根结点
线索二叉树:指针指向左右子树,线索指向前驱和后继。
对二叉树以某种次序遍历使其变为线索二叉树的过程叫做线索化。
4.树和森林
1.树的存储结构
1.双亲表示法
2.孩子表示法
3.孩子兄弟表示法
5.树与等价问题
在离散数学中,对等价关系和等价类的定义是:如果集合S中的关系R是自反的,对称的和传递的,则称它为一个等价关系。
等价关系是现实世界中广泛存在的一种关系,许多应用问题可以归结为按给定的等价关系划分某集合为等价类,通常称这类问题为等价问题。
6.赫夫曼树及其应用
赫夫曼树,又称最优树,是一类带权路径长度最短的树。
1.最优二叉树(赫夫曼树)
首先给出路径和路径长度的概念。从树中一个结点到另外结点之间的分支构成这两个结点之间的路径,路径上的分支数目称作路径长度。树的路径长度是从树根到
每一结点的路径长度之和。
结点的带权路径长度为从该结点到树根之间的路径长度与结点上权的乘积。树的带权路径长度为树中所有叶子结点的带权路径长度之和,通常记作WPL。WPL最小的
二叉树称作最优二叉树或者赫夫曼树。
在解决某些判定问题时,利用赫夫曼树可以得到最佳判定算法。
那么如何构造赫夫曼树呢?赫夫曼最早给出了一个带有一般规律的算法,称为赫夫曼算法。如下:
1.根据给定的n个权值{w1,w2,...,wn}构成n棵二叉树的集合F={T1,T2,...,Tn},其中每棵二叉树Ti中只有一个带权为wi的根结点,其左右子树均空。
2.在F中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左,右子树上的根结点的权值之和。
3.在F中删除这两棵树,同时将新得到的二叉树加入F中
4.重复(2),(3),直到F只含一棵树为止。这棵树便是赫夫曼树。
2.赫夫曼编码
若要设计长短不等的编码,则必须是任一一个字符的编码都不是另一个字符的编码的前缀,这种编码称为前缀编码。
可以利用二叉树来设计二进制的前缀编码。左分支为0,右分支为1,则可以从根结点到叶子结点的路径上分支字符组成的字符串作为该叶子结点字符的编码。
设计电文总长最短的二进制前缀编码即为以n种字符出现的频率作为权,设计一棵赫夫曼树的问题,由此得到的二进制前缀编码便称为赫夫曼编码。
7.回溯法和树的遍历
在程序设计中,有相当一类求一组解,或求全部解或求最优解的问题,例如八皇后问题等,不是根据某种确定的计算法则,而是利用试探和回溯的搜索技术求解。回溯
法也是设计递归过程的一种重要的方法,它的求解过程实质上是一个先序遍历一颗'状态树'的过程,只是这棵树不是遍历前预先建立的,而是隐含在遍历过程中。
8.树的计数
树的计数:具有n个结点的不同形态的树有多少棵?