哈夫曼树的构造 java_Java实现哈夫曼树的构造

哈夫曼树的内容这里不作解释,请自己搜索。下面给出哈夫曼树构造过程的 Java 实现。 结点类: 1./**2. * 二叉树节点3. */4.public class Node implements Comparable {5.6. private int value;7.8. private Node leftChild;9.10. private Node rightChild;11

哈夫曼树的内容这里不作解释,请自己搜索。下面给出哈夫曼树构造过程的 Java 实现。

结点类:1./**2. * 二叉树节点3. */4.public class Node implements Comparable {5.6. private int value;7.8. private Node leftChild;9.10. private Node rightChild;11.12. public Node(int value) {13. this.value = value;14. }15.16. public int getValue() {17. return value;18. }19.20. public void setValue(int value) {21. this.value = value;22. }23.24. public Node getLeftChild() {25. return leftChild;26. }27.28. public void setLeftChild(Node leftChild) {29. this.leftChild = leftChild;30. }31.32. public Node getRightChild() {33. return rightChild;34. }35.36. public void setRightChild(Node rightChild) {37. this.rightChild = rightChild;38. }39.40. public String toString(int level) {41. String indent = "";42. for (int i = 0; i < level; i++) {43. indent += " ";44. }45.46. return indent + value + "/n" +47. (leftChild != null ? leftChild.toString(level + 1) : "") +48. (rightChild != null ? rightChild.toString(level + 1) : "");49. }50.51. public int compareTo(Object o) {52. Node that = (Node) o;53. double result = this.value - that.value;54. return result > 0 ? 1 : result == 0 ? 0 : -1;55. }56.}

哈夫曼树构造类:1.public class HuffmanTreeBuilder {2. 3. public static void main(String[] args) {4. List nodes = Arrays.asList(5. new Node(40),6. new Node(8),7. new Node(10),8. new Node(30),9. new Node(10),10. new Node(2)11. );12. 13. Node node = HuffmanTreeBuilder.build(nodes);14. System.out.println(node.toString(0));15. }16. 17. /**18. * 构造哈夫曼树19. *20. * @param nodes 结点集合21. *22. * @return 构造出来的树的根结点23. */24. private static Node build(List nodes) {25. nodes = new ArrayList(nodes);26. sortList(nodes);27. while (nodes.size() > 1) {28. createAndReplace(nodes);29. }30. return nodes.get(0);31. }32. 33. /**34. * 组合两个权值最小结点,并在结点列表中用它们的父结点替换它们35. *36. * @param nodes 结点集合37. */38. private static void createAndReplace(List nodes) {39. Node left = nodes.get(nodes.size() - 1);40. Node right = nodes.get(nodes.size() - 2);41. Node parent = new Node(left.getValue() + right.getValue());42. parent.setLeftChild(left);43. parent.setRightChild(right);44. nodes.remove(nodes.size() - 1);45. nodes.remove(nodes.size() - 1);46. nodes.add(parent);47. sortList(nodes);48. }49. 50. /**51. * 将结点集合由大到小排序52. *53. * @param nodes 结点集合54. */55. private static void sortList(List nodes) {56. Collections.sort(nodes);57. }58.}

说明:

1、HuffmanTreeBuilder 的 25 行新建了一个结点集合,以免对参数进行修 改。

2、createAndReplace 方法首先获取末尾两个节点,然后构造它们的父结点 ,接着在结点集合中将这两个节点删除,把父结点加进去。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值