package datastructure.tree;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.stream.Collectors;
/**
* ******************************************
* Huffman tree, encoding, and decoding. For simplicity, only ASCII characters
* are supported.
*
* @author Michelle Min MitchelleMin@163.com
* @date 2021-06-15
* ******************************************
*/
public class Huffman {
/*
An inner class for Huffman nodes.
*/
class HuffmanNode {
/*
The char. Only valid for leaf nodes.
*/
char character;
/*
Weight. It can also be double.
*/
int weight;
/*
The left child.
*/
HuffmanNode leftChild;
/*
The right child.
*/
HuffmanNode rightChild;
/*
The parent. It helps constructing the Huffman code of each character.
*/
HuffmanNode parent;
/**
* *******************************
* The first constructor
* *******************************
*/
public HuffmanNode(char paraCharacter, int paraWeight, HuffmanNode paraLeftChild, HuffmanNode paraRightChild, HuffmanNode paraParent) {
character = paraCharacter;
weight = paraWeight;
leftChild = paraLeftChild;
rightChild = paraRightChild;
parent = paraParent;
}//Of HuffmanNode
/**
* *******************************
* To string.
* *******************************
*/
public String toString() {
String resultString = "(" + character + ", " + weight + ")";
return resultString;
}//of toString
}//Of class HuffmanNode
/*
The number of characters. 256 for ASCII.
*/
public static final int NUM_CHARS = 256;
/*
The input text. It is stored in a string for simplicity.
*/
String inputText;
/*
The length of the alphabet, also the number of leaves.
*/
int alphabetLength;
/*
The alphabet.
*/
char[] alphabet;
/*
The count of chars. The length is 2 * alphabetLength - 1 to include
non-leaf nodes.
*/
int[] charCounts;
/*
The mapping of chars to the indices in the alphabet.
*/
int[] charMapping;
/*
Codes for each char in the alphabet. It should have the same length as
alphabet.
*/
String[] huffmanCodes;
/*
All nodes. The last node is the root.
*/
HuffmanNode[] nodes;
/**
********************************
* The first constructor.
*
* @param paraFilename
* The text filename.
********************************
*/
public Huffman(String paraFilename){
charMapping = new int[NUM_CHARS];
readText(paraFilename);
}//Of the first constructor
/**
********************************
* Read text.
*
* @param paraFilename
* The text filename.
********************************
*/
public void readText(String paraFilename){
try{
inputText = Files.newBufferedReader(Paths.get(paraFilename), StandardCharsets.UTF_8)
.lines().collect(Collectors.joining("\n"));
}catch (Exception ee){
System.out.println(ee);
System.exit(0);
}//Of try
System.out.println("The text is: \r\n" + inputText);
}//Of readText
/**
********************************
* The entrance of the program.
*
* @param args
* Not used now.
********************************
*/
public static void main(String args[]){
Huffman tempHuffman = new Huffman("D:/mitchelles/data/huffmantext-small.txt");
}//Of main
}//Of class Huffman