哈夫曼編碼

2021-09-25 02:02:10 字數 2734 閱讀 5890

題目:哈夫曼編碼字符集,在各電文出現次數為。要求對其進行哈夫曼樹的構造和哈夫曼編碼函式的編寫,並且進行樹的層次遍歷。

/*** 重寫tostring方法獲取指定輸出格式

*/public string tostring()

//重寫compareto,實現物件的比較(此處為權值,權值相同比較data)

public int compareto(object obj)

public boolean isleftchild()

public boolean isrightchild()

//get、set方法

}

/**

* 哈夫曼樹的構造、哈夫曼編碼

* @author administrator

* */

public class haffmantree

//各電文出現次數為

nodes.add(new node(1, "a"));

nodes.add(new node(3, "b"));

nodes.add(new node(4, "c"));

nodes.add(new node(5, "d"));

nodes.add(new node(2, "e"));

nodes.add(new node(5, "f"));

//此處排序只能完成一次判斷,無法對後面的生成樹結點陣列進行判斷

//使用轉殖物件的原因,後面使用到的哈夫曼編碼不是對所有的字元進行顯示,

//所以必須保留原來集合的資料,使用轉殖物件保證在建立哈夫曼樹後不改變原來集合資料

//另外,可以避免多餘的取資料元素的操作

arraylistrnode = (arraylist) nodes.clone();

system.out.println("建立哈夫曼樹:");

node root = createtree(rnode);

//哈夫曼編碼

system.out.println("哈夫曼編碼:");

rnode = haffmancode(root);

rnode.retainall(nodes);  //reatinall取集合中相同的元素(交集)

printhaffmancode(rnode);

}/**

* 建立哈夫曼樹

*/private static node createtree(arraylistrnodes)

return rnodes.get(0);

}//哈夫曼編碼

/*** 傳入乙個根節點,根據左0右1原則,對每乙個結點進行編碼

* 使用廣度優先遍歷的方法對每一層進行遍歷

* 執行過程實質為廣度優先遍歷

* 步驟如下:

*    1.首先將根節點放入佇列中。

*    2.當隊列為非空時,迴圈執行步驟3到步驟5,否則執行6;

*    3.出佇列取得乙個結點,訪問該結點;

*    4.若該結點的左子樹為非空,那麼對lcode加"0"賦給左孩子的編碼,則將該結點的左子樹入佇列;

*    5.若該結點的右子樹為非空,那麼對rcode加"1"賦給右孩子的編碼,則將該結點的右子樹入佇列;

*    6.結束。

** @param root 根結點

* @return list集合

*/private static arraylisthaffmancode(node root)

while(!queue.isempty())

//如果右子節點不為null,將它加入到佇列

if(p.getrightchild() != null)

}return list;

}private static void printhaffmancode(arraylistnode)

}   

}

執行結果:建立哈夫曼樹:

node [data=a, weight=1]

node [data=e, weight=2]

node [data=3, weight=3]

node [data=3, weight=3]

node [data=b, weight=3]

node [data=6, weight=6]

node [data=c, weight=4]

node [data=d, weight=5]

node [data=9, weight=9]

node [data=f, weight=5]

node [data=6, weight=6]

node [data=11, weight=11]

node [data=9, weight=9]

node [data=11, weight=11]

node [data=20, weight=20]

哈夫曼編碼:

f    10   

d    01   

c    00   

b    111  

e    1101 

a    1100 

哈夫曼編碼 哈夫曼樹

1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....

哈夫曼樹 哈夫曼編碼

定義從a結點到b結點所經過的分支序列為從a結點到b結點的路徑 定義從a結點到b結點所進過的分支個數為從a結點到b結點的路徑長度 從二叉樹的根結點到二叉樹中所有結點的路徑長度紙盒為該二叉樹的路徑長度 huffman樹 帶權值路徑長度最小的擴充二叉樹應是權值大的外界點舉例根結點最近的擴充二叉樹,該樹即為...

哈夫曼編碼 哈夫曼樹

哈夫曼樹是乙個利用權值進行優化編碼的乙個比較奇怪的樹,他的實現比較簡單,用途也比較單一。哈夫曼樹的實現,實現要求 通過哈夫曼樹可以保證在編碼過程中不會出現例如 1000和100這樣的編碼規則,否則就會編碼失敗,因為1000和100在某些情況下的編碼會一模一樣。通過哈夫曼樹可以保證權值大的值進行編碼時...