树(习题课)

哈夫曼树
  • 在一棵树中,从一个结点到另外一个结点所通过的全部结点,被咱们称为两个结点之间的路径。

上面的二叉树当中,从根结点A到叶子结点H的路径,就是A,B,D,H。spa

  • 在一棵树中,从一个结点到另外一个结点所通过的“边”的数量,被咱们称为两个结点之间的路径长度。

仍然用刚才的二叉树举例子,从根结点A到叶子结点H,共通过了3条边,所以路径长度是3。3d

  • 结点的带权路径长度,是指树的根结点到该结点的路径长度,和该结点权重的乘积。

b8014a90f603738d412c05b1d5c4cc57f919ec21.jpg
如上图,假设结点H的权重是3,从根结点到结点H的路径长度也是3,所以结点H的带权路径长度是 3 X 3 = 9。blog

  • 树的带权路径长度(WPL),即在一棵树中,全部叶子结点的带权路径长度之和。29381f30e924b899297af1c50dd96193087bf6eb.jpg

仍然以这颗二叉树为例,树的路径长度是 3X3 + 6X3 + 1X2 + 4X2 + 8X2 = 53队列

哈夫曼树:哈夫曼树(Huffman Tree)是在叶子结点和权重肯定的状况下,带权路径长度最小的二叉树,也被称为最优二叉树
  • 举个例子,给定权重分别为1,3,4,6,8的叶子结点,咱们应当构建怎样的二叉树,才能保证其带权路径长度最小?

原则上,咱们应该让权重小的叶子结点远离树根,权重大的叶子结点靠近树根。rem

下图左侧的这棵树就是一颗哈夫曼树,它的WPL是46,小于以前例子当中的53:it

如下说法错误的是(  A )
  • A. 哈夫曼树是带权路径长度最短的树,路径上权值较大的结点离根较近。
  • B. 若一个二叉树的树叶是某子树的中序遍历序列中的第一个结点,则它必是该子树的后序遍历序列中的第一个结点。
  • C. 已知二叉树的前序遍历和后序遍历序列并不能唯一地肯定这棵树,由于不知道树的根结点是哪个。
  • D. 在前序遍历二叉树的序列中,任何结点的子树的全部结点都是直接跟在该结点的以后。
度为二的树就是二叉树。(  错 )

首先,咱们明确一个概念,树的度数是按节点的最大度数来定义的。因此,度为 2 的树要求每一个节点最多只能有两棵子树,而且至少有一个节点有两棵子树;这与二叉树的要求:度不超过 2,就是说度也能够是 1 或者 0相矛盾。
其次,二叉树还有一个重要特色:左子树和右子树不同;而普通的树不分左右子树.class

二叉树共有5种基本形态

(1)空二叉树;(2)只有一个根结点的二叉树;(3)只有左子树;(4)只有右子树;(5)左右子树都有的二叉树二叉树

霍夫曼树的结点个数不能是偶数

首先,哈夫曼树只有度为0和2的节点。这是由于哈夫曼树的构造老是以两棵值最小的树合并,每次合并都是两棵子树,不会有度为1的节点。
由二叉树性质,二叉树的节点关系n0=n2+1,也就是度为0的节点数老是比度为2的节点数多1.若其中一个为奇数那么另一个就必然是偶数,加起来就仍是奇数。遍历

哈夫曼树的构造方法

假设有6个叶子结点,权重依次是2,3,7,9,18,25,如何构建一颗哈夫曼树,也就是带权路径长度最小的树呢?方法

第一步:构建森林

咱们把每个叶子结点,都当作树一颗独立的树(只有根结点的树),这样就造成了一个森林:

在上图当中,右侧是叶子结点的森林,左侧是一个辅助队列,按照权值从小到大存储了全部叶子结点。至于辅助队列的做用,咱们后续将会看到。

第二步:选择当前权值最小的两个结点,生成新的父结点,不断重复至只有一个节点。

借助辅助队列,咱们能够找到权值最小的结点2和3,并根据这两个结点生成一个新的父结点,父节点的权值是这两个结点权值之和:

此时,队列中仅有一个结点,说明整个森林已经合并成了一颗树,而这棵树就是咱们想要的哈夫曼树:

相关文章
相关标签/搜索