上面的二叉树当中,从根结点A到叶子结点H的路径,就是A,B,D,H。spa
仍然用刚才的二叉树举例子,从根结点A到叶子结点H,共通过了3条边,所以路径长度是3。3d
如上图,假设结点H的权重是3,从根结点到结点H的路径长度也是3,所以结点H的带权路径长度是 3 X 3 = 9。blog
仍然以这颗二叉树为例,树的路径长度是 3X3 + 6X3 + 1X2 + 4X2 + 8X2 = 53队列
原则上,咱们应该让权重小的叶子结点远离树根,权重大的叶子结点靠近树根。rem
下图左侧的这棵树就是一颗哈夫曼树,它的WPL是46,小于以前例子当中的53:it
首先,咱们明确一个概念,树的度数是按节点的最大度数来定义的。因此,度为 2 的树要求每一个节点最多只能有两棵子树,而且至少有一个节点有两棵子树;这与二叉树的要求:度不超过 2,就是说度也能够是 1 或者 0相矛盾。
其次,二叉树还有一个重要特色:左子树和右子树不同;而普通的树不分左右子树.class
(1)空二叉树;(2)只有一个根结点的二叉树;(3)只有左子树;(4)只有右子树;(5)左右子树都有的二叉树二叉树
首先,哈夫曼树只有度为0和2的节点。这是由于哈夫曼树的构造老是以两棵值最小的树合并,每次合并都是两棵子树,不会有度为1的节点。
由二叉树性质,二叉树的节点关系n0=n2+1,也就是度为0的节点数老是比度为2的节点数多1.若其中一个为奇数那么另一个就必然是偶数,加起来就仍是奇数。遍历
假设有6个叶子结点,权重依次是2,3,7,9,18,25,如何构建一颗哈夫曼树,也就是带权路径长度最小的树呢?方法
第一步:构建森林
咱们把每个叶子结点,都当作树一颗独立的树(只有根结点的树),这样就造成了一个森林:
在上图当中,右侧是叶子结点的森林,左侧是一个辅助队列,按照权值从小到大存储了全部叶子结点。至于辅助队列的做用,咱们后续将会看到。
第二步:选择当前权值最小的两个结点,生成新的父结点,不断重复至只有一个节点。
借助辅助队列,咱们能够找到权值最小的结点2和3,并根据这两个结点生成一个新的父结点,父节点的权值是这两个结点权值之和:
此时,队列中仅有一个结点,说明整个森林已经合并成了一颗树,而这棵树就是咱们想要的哈夫曼树: