数据结构是程序设计的重要基础,它所讨论的内容和技术对从事软件项目的开发有重要作用。学习数据结构要达到的目标是学会从问题出发,分析和研究计算机加工的数据的特性,以便为应用所涉及的数据选择适当的逻辑结构、存储结构及其相应的操作方法,为提高利用计算机解决问题的效率服务。
数据结构是指数据元素的集合及元素间的相互关系和构造方法。元素之间的相互关系是数据的 逻辑结构,数据元素及元素之间关系的存储称为 存储结构(或物理结构)。数据结构按照逻辑关系的不同分为 线性结构和 非线性结构两大类,其中,非线性结构又可分为树结构和图结构。
树结构是一种非常重要的非线性结构,该结构中的一个数据元素可以有两个或两个以上的直接后继元素,树可以用来描述客观世界中广泛存在的层次结构关系。
二叉树是 n(n≥0)个结点的有限集合,它或者是空树(n=0),或者是由一个根结点及两棵不相交的且分别称为左、右子树的二叉树所组成。
1、最优二叉树
最优二叉树又称为哈夫曼树,它是一类带权路径长度最短的树。路径是从树中一个结点到另一个结点之间的通路,路径上的分支数目称为路径长度。
树的路径长度是从树根到每一个叶子之间的路径长度之和。结点的带权路径长度为从该结点到树根之间的路径长度与该结点权值的乘积。
树的带权路径长度为树中所有叶子结点的带权路径长度之和,记为
W P L = Σ k = 1 n w k l k WPL={\huge\Sigma}^n_{k=1}{\large w}_k {\large l}_k WPL=Σk=1nwklk
其中,n 为带权叶子结点数目,wk 为叶子结点的权值,lk为叶子结点到根的路径长度。
哈夫曼树是指权值为 w1,w2,···,wn 的n个叶子结点的二又树中带权路径长度最小的二叉树。
例如,下图所示的具有4个叶子结点的二叉树,其中以图 (b) 所示的二叉树带权路径长度最小。
那么如何构造最优二叉树呢? 构造最优二叉树的哈夫曼算法如下。
(1)根据给定的n个权值 {w1,w2,···,wn},构成n颗二叉树的集合F= (T1,T2,···,Tn},其中,每棵树 Ti 中只有一个带权为 wi 的根结点,其左、右子树均空。
(2)在F中选取两棵权值最小的树作为左、右子树构造一棵新的二叉树,置新构造二叉树的根结点的权值为其左、右子树根结点