gusucode.com > 基于matlab的JPEG彩色图像编码解码源码程序 > 基于matlab的JPEG彩色图像编码解码源码程序/code/huffmanFromFile.m
function tree=huffmanFromFile(valueInOrder) n=length(valueInOrder); node.left=int16(-1); node.right=int16(-1); node.parent=int16(-1); node.value=int16(-1); node.isleaf=false; node.code=''; tree(2*n-1)=node; leafClassify{valueInOrder{n}.codeLength}=[];%按码字长度对叶子节点进行分类 for i=1:n tree(i)=node; tree(i).value=valueInOrder{i}.value; tree(i).isleaf=true; leafClassify{valueInOrder{i}.codeLength}=[leafClassify{valueInOrder{i}.codeLength} i];%将该叶子节点追加到该分类 end for i=n+1:2*n-1 tree(i)=node; end %建立huffman树 codeSize=valueInOrder{n}.codeLength;%从最长码字位数开始 nodeClassify=[];%保存含该种位数的所有节点 internalNodeClassify{codeSize}=[];%按码字长度对内节点进行分类 i=n+1; while i<=2*n-1 %共需要兄弟配对n-1次 nodeClassify=[leafClassify{codeSize} internalNodeClassify{codeSize}]; index=length(nodeClassify);%nodeClassify数组的下标 while index>=2 %树中该层还有可以配对的兄弟节点 %取出两个节点进行组合 left=nodeClassify(index-1); right=nodeClassify(index); index=index-2; tree(left).parent=i; tree(left).code='0'; tree(right).parent=i; tree(right).code='1'; tree(i).left=left; tree(i).right=right; if codeSize>1 %最后配对的节点的父节点是根,码字长度为0,不需要也无法保存 internalNodeClassify{codeSize-1}=[i internalNodeClassify{codeSize-1}];%将新产生的内节点放入分类数组 end i=i+1; end %树中该层没有可以配对的兄弟节点 codeSize=codeSize-1;%转向上一层节点 end %对每个叶子节点进行编码,该操作不必要进行,仅用于程序调试,验证生成的树是正确的 for i=1:n p=tree(i).parent; while(p~=-1) tree(i).code=strcat(tree(p).code,tree(i).code); p=tree(p).parent; end end end