课程:《程序设计与数据结构》
班级: 1823
姓名: 赵沛凝
学号:20182301
实验教师:王志强
实验日期:2019年11月18日
必修/选修: 必修
//读取文件
File file = new File("E:\\idea\\week_12s\\input.txt");
Scanner scan = new Scanner(file);//Scanner的新用法
String s =scan.nextLine();//读取出来字符串
//写入文件
File file2 = new File("E:\\idea\\week_12s\\put.txt");
FileWriter fileWriter1 = new FileWriter(file1);
fileWriter1.write(result2);
System.out.println("打印各字母出现频率:");
for (int i = 0; i < array.length; i++) {
System.out.print((char) ('a' + i) + ":" + (double) array[i] / s.length() + "\n");
}//把26个字母的概率都打出来
HuffmanTreeNode[] huffmanTreeNodes = new HuffmanTreeNode[array.length];//构建哈夫曼树的结点
for (int i = 0; i < array.length; i++) {
huffmanTreeNodes[i] = new HuffmanTreeNode(array[i], (char) ('a' + i), null, null, null);
}
package com.company;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Stack;
public class HuffmanTree {
HuffmanTreeNode root; // 根结点
private String[] codes = new String[26];
public HuffmanTree(HuffmanTreeNode[] a) throws EmptyCollectionException {
HuffmanTreeNode parent = null;
ArrayHeap<HuffmanTreeNode> heap;
// 建立数组a对应的最小堆
heap = new ArrayHeap<>();
for(int i=0; i<a.length; i++) {
heap.addElement(a[i]);
}
for(int i=0; i<a.length-1; i++) {
HuffmanTreeNode left = heap.removeMin(); // 最小节点是左孩子
HuffmanTreeNode right = heap.removeMin();
parent = new HuffmanTreeNode(left.weight+right.weight,' ',left,right,null);
left.parent = parent;
right.parent = parent;
heap.addElement(parent);
}
root = parent;
}
public String printTree() throws EmptyCollectionException {
UnorderedListADT<HuffmanTreeNode> nodes =
new ArrayUnorderedList();
UnorderedListADT<Integer> levelList =
new ArrayUnorderedList<Integer>();
HuffmanTreeNode current;
String result = "";
int printDepth = this.getHeight()-1;
int possibleNodes = (int)Math.pow(2, printDepth + 1);
int countNodes = 0;
nodes.addToRear(root);
Integer currentLevel = 0;
Integer previousLevel = -1;
levelList.addToRear(currentLevel);
while (countNodes < possibleNodes)
{
countNodes = countNodes + 1;
current = nodes.removeFirst();
currentLevel = levelList.removeFirst();
if (currentLevel > previousLevel)
{
result = result + "\n\n";
previousLevel = currentLevel;
for (int j = 0; j < ((Math.pow(2, (printDepth - currentLevel))) - 1); j++)
result = result + " ";
}
else
{
for (int i = 0; i < ((Math.pow(2, (printDepth - currentLevel + 1)) - 1)) ; i++)
{
result = result + " ";
}
}
if (current != null)
{
result = result + current.weight;
nodes.addToRear(current.left);
levelList.addToRear(currentLevel + 1);
nodes.addToRear(current.right);
levelList.addToRear(currentLevel + 1);
}
else {
nodes.addToRear(null);
levelList.addToRear(currentLevel + 1);
nodes.addToRear(null);
levelList.addToRear(currentLevel + 1);
result = result + " ";
}
}
return result;
}
private int getHeight() {
return height(root);
}
private int height(HuffmanTreeNode node)
{
if(node==null){
return 0;
}
else {
int leftTreeHeight = height(node.left);
int rightTreeHeight= height(node.right);
return leftTreeHeight>rightTreeHeight ? (leftTreeHeight+1):(rightTreeHeight+1);
}
}
protected void inOrder( HuffmanTreeNode node,
ArrayList<HuffmanTreeNode> tempList)
{
if (node != null)
{
inOrder(node.left, tempList);
if (node.element!=' ')
tempList.add(node);
inOrder(node.right, tempList);
}
}
public String[] getEncoding() {
ArrayList<HuffmanTreeNode> arrayList = new ArrayList();
inOrder(root,arrayList);
for (int i=0;i<arrayList.size();i++)
{
HuffmanTreeNode node = arrayList.get(i);
String result ="";
int x = node.element-'a';
Stack stack = new Stack();
while (node!=root)
{
if (node==node.parent.left)
stack.push(0);
if (node==node.parent.right)
stack.push(1);
node=node.parent;
}
while (!stack.isEmpty())
{
result +=stack.pop();
}
codes[x] = result;
}
return codes;
}
public HuffmanTreeNode getRoot() {
return root;
}
}
//进行编码:二进制加法
String result = "";
for (int i = 0; i < s.length(); i++) {
int x = s.charAt(i) - 'a';
result += codes[x];
}
System.out.println("编码结果:" + result);
//进行解码
String result2 = "";
for (int i = 0; i < s1.length(); i++) {
if (s1.charAt(i) == '0') {
if (huffmanTreeNode.left != null) {
huffmanTreeNode = huffmanTreeNode.left;
}
} else {
if (s1.charAt(i) == '1') {
if (huffmanTreeNode.right != null) {
huffmanTreeNode = huffmanTreeNode.right;
}
}
}
if (huffmanTreeNode.left == null && huffmanTreeNode.right == null) {
result2 += huffmanTreeNode.element;//把一个个字母加起来
huffmanTreeNode = huffmanTree.getRoot();//移到上一个结点
}
}
到现在,我已经学习了很多树了,逐渐有了树的思维,以后也会多多运用的。
20182301 2019-2020-1 《数据结构与面向对象程序设计》哈夫曼实验报告
原文:https://www.cnblogs.com/zhaopeining/p/11900292.html