import java.util.*;
public class HuffmanTree {
private List<TreeNode> nodes;
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
int n, value;
System.out.print("Enter number of tree nodes: ");
n = reader.nextInt();
HuffmanTree ht = new HuffmanTree();
for(int i = 1; i <= n; i++) {
System.out.print("Enter No." + i + " tree node's value: ");
value = reader.nextInt();
ht.addNode(new TreeNode(value, null, null));
}
ht.construct();
ht.printNodes();
}
public HuffmanTree() {
nodes = new LinkedList<TreeNode>();
}
public void printNodes() {
print(nodes.get(0));
}
private void print(TreeNode node) {
if (node != null) {
if (node.getRightChild() == null && node.getLeftChild() == null)
System.out.println("Node value: " + node.getValue() + " code: " + node.getCode());
print(node.getLeftChild());
print(node.getRightChild());
}
}
public void addNode(TreeNode tn) {
int n = nodes.size();
if (n == 0) {
nodes.add(0, tn);
return ;
}
int i;
for (i = 0; i < n; i++) {
if (nodes.get(i).getValue() > tn.getValue())
break;
}
nodes.add(i, tn);
}
public void construct() {
TreeNode left, right;
int v;
while(nodes.size() > 1) {
left = nodes.remove(0);
right = nodes.remove(0);
v = left.getValue() + right.getValue();
addNode(new TreeNode(v, left, right));
}
TreeNode node = nodes.get(0);
preorderTraversal(node, "0");
}
public void preorderTraversal(TreeNode node, String code) {
if (node != null) {
node.setCode(code);
preorderTraversal(node.getLeftChild(), code + "1");
preorderTraversal(node.getRightChild(), code + "0");
}
}
}
class TreeNode {
private int value;
private TreeNode lChild;
private TreeNode rChild;
private String code;
public TreeNode(int v, TreeNode left, TreeNode right) {
value = v;
lChild = left;
rChild = right;
}
public int getValue() {
return value;
}
public void setCode(String code) {
this.code = code;
}
public String getCode() {
return code;
}
public TreeNode getLeftChild() {
return lChild;
}
public TreeNode getRightChild() {
return rChild;
}
}
06-25
5295