</p>2 a r1 o" ^9 O
7 F; [- N& } }# ?
root = nodes.poll();5 w. D: w: S9 K( h8 N
}//机关函数(correct)' B! D D" v: G+ E. o/ z3 i/ }
接下来,要做的就是获得0——256之间每个字节所对应的哈弗曼编码,用一个String[] Code = new Code[256]保留 下来Java代码//获得编码$ e9 ]- r1 E" E
private void getStrByte(hfmNode node,String s){
7 J; o# E0 u+ g# l+ ~: }* R+ rif(node.getLeft()==null&&node.getRight()==null){$ `0 C% l4 Q# _0 w
Code[node.getData()] = s;//获得编码字符串
. N l- J# J7 S9 m {5 x7 T+ n}
7 T: @; z; \8 F* gif(node.getLeft()!=null){
/ _; O5 B" | c5 ngetStrByte(node.getLeft(),s+“0”);1 \3 {; o2 r& ?
}//左零 if(node.getRight()!=null){
" e5 u5 o: X* m9 b6 ]1 {% @3 Q' m4 ?getStrByte(node.getRight(),s+“1”);
4 z5 C. h3 E( x/ W) K. c}//右1
, K- i Q- S. I, L) W! M, E}
1 p$ { g7 r) i6 z y0 q% R9 A/ k然后就是把每个字节的编码长度打入文件:Java代码//先将0-255的编码长度打到文件里
% I8 n+ C& f$ D4 p) J) E/ f& v& Efor(int i=0;i6 u- I& p$ I- n
if(Code[i]==null||Code[i]==“”){: e6 z5 a7 H& I* a" k
Code[i] = “”;
; B6 Y+ {* p& N8 D$ ]; lbos.write(0);
7 Y' o2 f& x- ^+ f/ N* ]" ~}else{
, r! x. R( S8 sbos.write(Code[i].length());$ P- J5 f! `% r( u# {
} T6 J& F9 H3 t) a% s& q$ l
}) p* P; r) M- Y8 f& h( t W- \6 S
接下来就是,将每个字节的编码打入文件(这里需要吧8个长度的01串转换成一个byte打入文件):Java代码//把每个字节的编码表打到文件里2 A4 D" s; g1 L' _) ?( n3 l
int i = 0;//第i个字节
9 Y6 Y# j- \ Z% H6 C+ Dint count = 0;//满8打一,计数器2 j! H, U& Q+ v
String writeCode = “”;//写入的8位编码
1 V# T8 V: S6 R; ~, f& bString allCode = “”;//所有待写入的编码0 ~7 a3 N/ X3 P; L; ~7 N1 ]) {
String inCode = “”;) }3 E6 c, V' V3 h+ N' O( D0 x; {) P
while(i《256||count》=8){
1 H3 G7 V7 Y5 p2 y, Kif(count》=8){//满8; w3 ?. W0 ^4 m% C6 _8 }* a
writeCode = allCode.substring(0,8);//前8位
8 g9 |- r2 N3 v G8 wcount-=8;
# _) o9 O& ?( s# V' h i1 h8 T" jallCode = allCode.substring(8);
9 N$ M7 Y( p& q% M& A1 `2 F z: \bos.write(changeString(writeCode));//写入一个字节* A0 F5 l/ v2 E+ J. J" F
}else{3 T2 Y% q% o& h9 M- G
count+=Code[i].length();4 S- {# X! z) {# l% x6 c5 c$ h
allCode+=Code[i];
# d: ~' t1 h# S4 G. v9 H/ c/ I3 VinCode+=Code[i];
9 A: [4 a! Z5 I I7 o% o4 U4 ii++;//严重错误发生地
0 d, C: C4 o5 h' E; P2 M3 n}
5 F7 @ D g( j, S5 ]' n}. D/ @4 T' U! B' ~7 F
//如不美观不满8位的& z% n% u/ | G' Q, u
if(allCode.length()》0){$ j1 x8 I0 p) Z- f1 H: Q
int len = 8-allCode.length();//补零
' N8 T' ]8 z* n- T: L4 y+ d& \/ e B% qfor(int j=0;j$ Y0 B. f* c7 O. P! A0 [
allCode+=“0”;1 W4 h* I, y: ~
" j5 {- n- I6 j/ O" w6 a} |