数据结构之哈夫曼树

1.老规矩先介绍哈夫曼树:给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。
2.建树:
1)对给定的n个权值构成初始集合F={A1,A2,A3...};
2)在F中选取两棵根结点权值最小的树作为新构造的二叉树的左右子树,新二叉树的根结点的权值为其左  右子树的根结点的权值之和。
3)从F中删除这两棵树,并把这棵新的二叉树同样以升序排列加入到集合F中。
4)重复2)和3),直到集合F中只有一棵二叉树为止。
3.不多说上代码:
public class Node {
Node left, right;
String code = "";
int data;
}

public class NodeTree {
Node[] Node;

public Node creat(int dd[]) {
                //创建节点数组
Node = new Node[dd.length];
                //把数组中数字存到节点上
for (int i = 0; i < dd.length; i++) {
Node temp = new Node();
temp.data = dd[i];
Node[i] = temp;
}
while (Node.length > 1) {
                        //排序,将数组Node中值最小的放在前两位
sort(Node);
                        //把两个节点组合
Node n1 = MyNode[0];
Node n2 = MyNode[1];
Node n3 = new Node();
n3.left = n1;
n3.right = n2;
n3.data = n1.data + n2.data;
                        //创建一个新数组
Node[] temp = new Node[Node.length - 1];
temp[0] = n3;
for (int i = 1; i < Node.length - 1; i++)
temp[i] = Node[i + 1];
                        //替换原先数组
Node = temp;
}
return Node[0];
}

        //这方法为冒泡排序
public void sort(Node[] Node) {
for (int i = 0; i < Node.length; i++) {
for (int j = i + 1; j < Node.length; j++) {
if (Node[i].data > Node[j].data) {
Node temp = Node[j];
Node[j] = Node[i];
Node[i] = temp;
}
}
}
}

        //打印编码
public void print(Node node) {
if (node.left == null && node.right == null) {
System.out.println(node.data + "的哈夫曼编码是:" + node.code);
}
if (node.right != null) {
node.left.code = node.code + '0';
print(node.left);
}
if (node.left != null) {
node.right.code = node.code + '1';
print(node.right);
}
}
}

你可能感兴趣的:(数据结构)