</p>( F6 M% g- b+ @3 k5 K
3 g S) j$ ~- M6 i) g9 T# nroot = nodes.poll();- a; O& M/ u. S( I1 g5 Z G7 R
}//机关函数(correct)" Z( G( x2 g5 l. Q# H: p6 O5 C6 p
接下来,要做的就是获得0——256之间每个字节所对应的哈弗曼编码,用一个String[] Code = new Code[256]保留 下来Java代码//获得编码
$ A3 `4 T2 J1 jprivate void getStrByte(hfmNode node,String s){
) J% c* B0 [, G9 k$ jif(node.getLeft()==null&&node.getRight()==null){+ B) ~: T( D4 {$ y R' O, |8 m
Code[node.getData()] = s;//获得编码字符串
! u( F# \1 K( f}9 b, `0 Q/ ?0 a9 p
if(node.getLeft()!=null){
3 [" E7 [( }* |/ @) r' V, v H' c, o# Y8 YgetStrByte(node.getLeft(),s+“0”);
* y% H0 p$ \# t, g m$ Q}//左零 if(node.getRight()!=null){
; S2 s' B% X" V9 I( [getStrByte(node.getRight(),s+“1”);
9 a1 s) z0 ?* _! J6 X6 U/ {9 @# w}//右11 U' V6 t* q S( A7 X6 E' t
}' a# X% F$ I5 m J3 B, m. V8 K1 @
然后就是把每个字节的编码长度打入文件:Java代码//先将0-255的编码长度打到文件里
# r: y3 w2 R2 i5 d2 \for(int i=0;i
+ E+ A8 P% |3 ^3 Aif(Code[i]==null||Code[i]==“”){8 {7 v1 z9 G; D. y0 U
Code[i] = “”;, G4 w v, I! R6 F9 i
bos.write(0);
" I. h. A1 C! Y3 `4 N0 K! L}else{$ d/ @" j5 h v! j( D+ e
bos.write(Code[i].length());
/ M: K7 B+ l8 F4 W' }+ |: t4 U}* U7 q6 m" r9 A% u
}
6 q8 l% g+ n- W8 v0 u2 H& j接下来就是,将每个字节的编码打入文件(这里需要吧8个长度的01串转换成一个byte打入文件):Java代码//把每个字节的编码表打到文件里
' i- \6 S6 t5 Hint i = 0;//第i个字节" u# W2 f' `6 {* _+ N! O& |( M, O
int count = 0;//满8打一,计数器
! c: b+ `0 f H4 tString writeCode = “”;//写入的8位编码
+ M5 k) f* S' Q7 s+ V5 SString allCode = “”;//所有待写入的编码( ^* h7 H! e# W" T
String inCode = “”;6 E/ x: N. q' Y) x
while(i《256||count》=8){
& R, f; b6 d: kif(count》=8){//满8" T6 s ^7 K* k# `
writeCode = allCode.substring(0,8);//前8位6 Y5 |# r+ ^' B( a- c$ H6 `
count-=8;
/ h [4 W* ~' M) E& L. \! t/ {, aallCode = allCode.substring(8);7 a% s, t; ]/ q( F5 A f& \
bos.write(changeString(writeCode));//写入一个字节5 k1 o/ E5 P' l5 Q/ A
}else{3 H; u! c9 Q9 i& w
count+=Code[i].length();
; r- s# S% E- B4 UallCode+=Code[i];6 `9 F' u6 o8 T8 `9 S6 E$ ?
inCode+=Code[i];
- j6 S- M* a) P9 Z; w% gi++;//严重错误发生地
& F7 V# |3 U$ d! Q4 u6 \}4 _3 S7 b& j$ K: m/ ^, ]
}
3 L' Z0 H+ Q* [/ o: q7 k; _+ d//如不美观不满8位的
" S" Q( g' M5 t4 e4 C+ oif(allCode.length()》0){' J; ~( p/ X0 A" K
int len = 8-allCode.length();//补零7 `- i6 d. x9 \
for(int j=0;j
( [/ Q/ ?* o( {2 `. l/ V" A, q% QallCode+=“0”;1 x4 s5 _8 L- D- W# W! i( N
* Q. x( S) N( c: u
} |