function c = huffman(p)
% 例如在matlab中输入:p=[0.2 0.19 0.18 0.17 0.15 0.1 0.01]; c = huffman(p)
n = size(p , 2)
if n == 1 %此时已合并到一棵树上了,直接返回
c = cell(1,1)
c{1} = ''
return
end
%找最小的
[p1 , i1] = min(p)
index = [(1:i1-1) , (i1+1:n)]
%这里的index是一个trick
%他跟踪了现在的p的每个分量,在原来的p里面的下标
%在最后,将依据这个下标来成码
p = p(index)
n = n - 1
%找第二小的。
[p2 , i2] = min(p)
index2 = [(1:i2-1) , (i2+1:n)]
%index2是在上一个p中的下标
p = p(index2)
i2 = index(i2) %i2变为在原p中次小值的下标
index = index(index2) %继续跟踪现在的p在原p中的下标
p(n) = p1 + p2 %生成一个新节点,即合并的两个最小节点的和
disp('xxxx')
c = huffman(p) %对新的p的序列做huffman编码
c{n+1} = strcat(c{n} , '1') %p(n)是开始合并的节点
c{n} = strcat(c{n} , '0')%这里从c(n)分出两枝,对开始合并的两节点成码
n
c
%恢复原顺序
index = [index , i1 , i2]
c(index) = c;