如何生成这个霍夫曼树(类似于二叉树)

时间:2012-08-14 09:53:26

标签: java tree binary-tree huffman-code

我知道如何在频率彼此不同时创建霍夫曼树,但如果几个频率相同,我将如何绘制这个霍夫曼树:

找到了霍夫曼树的简单解释here

我想创建的赫夫曼树的数据:

Letter Frequency
A       15%
B       15%
C       10%
D       10%
E       30%
F       20%

现在我从字母CD

的两个最低频率开始
   .
  / \
 C   D

但是下一步会是什么?因为我们AB的频率相同,我们选择哪一个?如果我们选择其中一个,那么当选择第二个时,结构将如何看待?

如果我选择B,那么它将会是这样的(除非我错了)

     .
    / \
   B   .
      / \
     C   D

这一步之后怎么样?

这些也可以用Java和C编码,我试图在实现它们之前先弄清楚它们是如何工作的。

修改

我的树看起来像这样:

         ___________|_________________
        /\                            |
       /  \                           |
      F    E                          |
     / \                              |
    /   \                             |
   B     A                           /\
                                    /  \
                                   C    D

还从网上获得了一个例子

enter image description here

3 个答案:

答案 0 :(得分:3)

逐步回答您的问题。

所以你从

开始
A = 15%  
B = 15% 
C = 10% * 
D = 10% *
E = 30%
F = 20%

你选择两个最低(C + D)并加入它们(它们的总和是20。

  20
 / \
C   D

你现在有

A = 15%  *
B = 15%  *
C+D = 20% 
E = 30%
F = 20%

现在你加入另外两个最低(A,B),总和为30。

      20      30
     / \     / \
    C   D    A  B

你现在有

A+B = 30%  
C+D = 20% *
E = 30%
F = 20%   *

最低的是(C + D,F),所以你加入它们

    40
   /  \      
  F   20      30
     / \     / \
    C   D    A  B


A+B = 30% *
C+D+F = 40% 
E = 30% *

下一步,与之前相同:

A+B+E = 60% *
C+D+F = 40% *


        100
       /   \
    40        60
   /  \      /  \
  F   20    E    30
     / \        / \
    C   D       A  B

答案 1 :(得分:2)

你将获得任何相同频率的代码。

|     letter      |  A  |  B  |  C  |  D  |  E  |  F  |
|-----------------|-----|-----|-----|-----|-----|-----|
|      freq       |  10 |  20 |  30 |  5  |  25 |  10 |
|-----------------|-----|-----|-----|-----|-----|-----|

按最大值

排序
|-----------------|-----|-----|-----|-----|-----|-----|
|     letter      |  C  |  E  |  B  |  F  |  A  |  D  |
|-----------------|-----|-----|-----|-----|-----|-----|
|      freq       |  30 |  25 |  20 |  10 |  10 |  5  |
|-----------------|-----|-----|-----|-----|-----|-----|

tree creating

freq           30    10     5     10     20     25
symbol          C     A     D      F      B      E
                      |     |
                      |--|--|
                        ||-|
                        |15|  = 5 + 10

2 step

freq          30    10     5     10     20     25
symbol         C     A     D      F      B      E
                     |     |      |
                     |     |      |
                     | |--||      |
                     |-|15||      |
                       ||-|       |
                        |         |
                        |    |--| |
                        |----|25|-| = 10 + 15
                             |--|

3 step

freq         30    10     5     10     20     25
sym          C     A     D      F      B      E
             |     |     |      |      |      |
             |     |     |      |      |      |
             |     | |--||      |      |      |
             |     |-|15||      |      |      |
             |       ||-|       |      |      |
             |        |         |      |      |
             |        |    |--| |      | |--| |
             |        |----|25|-|      |-|45|-|
             |             ||-|          ||-|
             |    |--|      |             |
             |----|55|------|             |
                  |-||                    |
                    |   |------------|    |
                    |---| Root (100) |----|
                        |------------|

编码:

   C = 00   
   A = 0100 
   D = 0101 
   F = 011  
   B = 10   
   E = 11   

答案 2 :(得分:1)

选择哪个并不重要,您将得到一些不同的编码,但具有相同的概率。在某些情况下,有更多可能的方法来构建树,但这并不重要。

我编辑了图像是因为我犯了一个错误,请查看我的第二个答案是否正确。