哈夫曼树的学习

路径:

从一个结点往下可以到达的结点之间的通路,称为路径。

路径长度:

某一路径所经过的“边”的数量,称为该路径的路径长度

结点的带权路径长度:

若将树中节点赋给一个带有某种含义的数值,则该数值称为该结点的权,从根结点到该节点之间的路径长度与该节点的权的乘积,称为该结点的带权路径长度。

树的带权路径长度:

树的带权路径长度规定为所有叶子结点的带权路径长度之和。


哈夫曼树:

哈夫曼树又称为最优二叉树,是带权路径长度最短的二叉树。

给定n个权值作为n个叶子结点,构造一颗二叉树,若该树的带权路径长度与其叶子结点的分布有关,即使是两颗结构相同的二叉树,也会因为其叶子结点的不同,导致两颗二叉树的带权路径长度不同。

构造一颗哈夫曼树的步骤:

1.初始状态下共有n个结点,结点的权值分别是给定的n个数,将他们视作n棵只有根结点的树。

2.合并其中根结点权值最小的两棵树,生成这两棵树的父结点,权值为这两个根结点的权值之和,这样树的数量就减少了一个。

3.重复操作2,直到只剩下一棵树为止,这棵树就是哈夫曼树。


哈夫曼树不存在度为1的结点,因为每次都是选择两颗树进行合并。

若给定n个数要求构建哈夫曼树,则构成的哈夫曼树的结点总数为2n-1,因为对应任意的二叉树,其度为0的叶子结点个数一定比度为2的结点个数多1.

为什么数组中下标为0的元素不存储结点信息?因为在数组中叶子结点的左右孩子是0,根结点的父结点是0,我们若是用数组中下标为0元素存储结点信息,那么我们将不能区分左右孩子为0的结点是叶子结点还是说该结点的左右孩子是下标为0的结点,同时也不知道哈夫曼树的根结点到底是谁。

要使叶子结点离根结点达到最远,那么生成的哈夫曼树应该是斜二叉树。

你可能感兴趣的:(学习,算法)