本文共 2238 字,大约阅读时间需要 7 分钟。
➢ 基本介绍
➢ 概念说明
➢ 构成赫夫曼树的步骤:
如下图所示
➢ 代码实现创建节点类,实现Comparable接口,用于排序
class HNode implements Comparable{ int value; // 节点的值 HNode left; // 左右子节点的指针 HNode right; public HNode(int value) { this.value = value; } // 前序遍历 public void DLR() { System.out.println(this);// 先输出根节点 // 左子树递归 if (this.left != null) { this.left.DLR(); } // 右子树递归 if (this.right != null) { this.right.DLR(); } } @Override public String toString() { return "HNode[value = " + value + "]"; } @Override public int compareTo(HNode o) { return this.value - o.value; // 从小到大排序 }}
定义方法:用于创建赫夫曼树
public static HNode create(int[] arr) { // 把数组的数据取出来放在节点类当中排序 Listnodes = new ArrayList (); for (int value : arr) { nodes.add(new HNode(value)); } while (nodes.size() > 1) { // 先进行排序 Collections.sort(nodes); // System.out.println("nodes = "+ nodes); // 取出最小的俩个数据 HNode leftnode = nodes.get(0); HNode rightnode = nodes.get(1); // 构建新的二叉树 HNode parent = new HNode(leftnode.value + rightnode.value); parent.left = leftnode; parent.right = rightnode; // 从当中删除使用过的子节点 nodes.remove(leftnode); nodes.remove(rightnode); // 把父节点加入进去 nodes.add(parent); } // System.out.println("第一次处理后:" +nodes); return nodes.get(0); }
以及一个前序遍历的方法
public static void DLR(HNode root) { if (root != null) { root.DLR(); } else { System.out.println("二叉树为空,无法遍历"); } }
在mian函数当中进行测试
int arr[] = { 4, 8, 13, 9, 1 }; HNode root = create(arr); DLR(root);遍历结果:可对照上述图片:HNode[value = 35]HNode[value = 13]HNode[value = 5]HNode[value = 1]HNode[value = 4]HNode[value = 8]HNode[value = 22]HNode[value = 9]HNode[value = 13]
或者简化一下数组当中的数据:如下图所示:
转载地址:http://jgmzi.baihongyu.com/