哈夫曼編碼 二叉樹應用

2021-08-11 07:57:20 字數 2719 閱讀 3948

其中包含兩個案列,乙個是特定的編碼,還有一種是鍵盤輸入自動計算權值以及解碼。案例一分別使用了陣列和鏈式棧實現哈夫曼樹的編碼同時可以計算壓縮率,案例二使用先序遍歷進行編碼計算總碼長

具體**如下

主類

public class testmian ;

double weight=;

hfmtool hfm1=new hfmtool(ch,weight);

//設定需要編碼的字元輸入字串進行解碼

hfmtool hfm2=new hfmtool();

hfm2.create();//建立哈夫曼樹並輸出結構和所有的字元編碼

string op="";

doelse

system.out.println("按x鍵退出按其他任意鍵繼續執行:");

op=sc.nextline();

}while(!op.tolowercase().equals("x"));

}}

三中資料結構

哈弗曼樹節點的設計

public class hfmtreenode  

}

哈夫曼編碼節點的設計

public class hfmcodenode 

}

鏈式棧的實現用於哈夫曼編碼

public inte***ce istack

public class stacknode

public stacknode(e data)

public stacknode(e data, stacknodenext)

//資料域get屬性

public e getdata()

//資料域set屬性

public void setdata(e data)

//引用域get屬性

public stacknodegetnext()

//引用域get屬性

public void setnext(stacknodenext)

}

public class linkstackimplements istack

// 入棧操作

public e push(e item)

// 出棧操作

public e pop()

return item;

} // 獲取棧頂資料元素

public e peek()

return item;

} // 求棧的長度

public int size()

// 判斷順序棧是否為空

public boolean empty() else

}}

主方法類

public class hfmtool 

public hfmtool(string str)

//傳入固定字元和頻率

public hfmtool(char ch,double weight)

//計算哈夫曼樹

public static void createhfmtree(char cn,double weight)else if(o==2)else if(o==3)

}else if(hfmtree[p].rchild==c)

c=p;//父結點為當前結點

p=hfmtree[c].parent;

} m[i]=o;

pnthfmcode2(stack,aa[i],o);

} //計算用三位二進行數進行的等長編碼平均長度為3的平均碼長

for(int g=0;g0)

cnt++;

}for(int i=0;i0)

c[i]=c[i]/str.length();

}this.leaf=cnt;

data = new hfmtreenode[this.leaf*2-1];

for(int i=0;i<2*leaf-1;i++)

data[i]=new hfmtreenode();

cnt=0;

char aa = new char[this.leaf];int o=0;//統計出現過的字元

for(int i=0;i<26;i++)

}double x1,x2;//記錄每次選擇的兩個最小值,x1q=new linkedlist();//設定乙個佇列儲存層序遍歷的結點

q.add(data[root]);//根結點入隊

int i=0;

string str="";

while(!q.isempty())

}if(tmp.lchild!=-1)

if(tmp.rchild!=-1)

}return str;

}}

最優二叉樹 哈夫曼編碼

樹的路徑長度是從樹根到樹中每一結點的路徑長度之和。在結點數目相同的二叉樹中,完全二叉樹的路徑長度最短。結點的權值 在一些應用中,賦予樹中結點的乙個有某種意義的實數 結點的帶權路徑長度 結點到樹根之間的路徑長度與該結點上權的乘積 樹的帶權路徑長度 wpl 定義為樹中所有結點的帶權路徑長度之和 在權為w...

哈夫曼樹(最優二叉樹)

給定n個權值作為n的 葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小 所謂樹的帶權路徑長度,就是樹中所有的葉結點 的權值乘上其到根結點的路徑長度 稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。假設有n個權值,則構造出的...

二叉樹與哈夫曼樹

1,二叉樹 二叉樹可以分為 完全二叉樹,滿二叉樹,哈夫曼樹 二叉樹的遍歷 遞迴 先序,中序,後序遍歷 二叉樹的結構 根節點,左子樹,右子樹 二叉樹的性質 1 如果二叉樹的節點個數為n,則父節點的個數為n 2 2 若2i 1 3 若2i 2 二叉樹的構建 構建二叉樹 public void creat...