Day578.霍夫曼树 -数据结构和算法Java
Posted 阿昌喜欢吃黄桃
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day578.霍夫曼树 -数据结构和算法Java相关的知识,希望对你有一定的参考价值。
霍夫曼树
一、介绍
二、重要概念
三、图解思路
四、代码实现
package com.achang.tree;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* 霍夫曼数
*/
public class HufumanTree
public static void main(String[] args)
int[] arr = 13, 7, 8, 3, 29, 6, 1;
Node2 hufuManTree = buildHufuManTree(arr);
hufuManTree.preList();//遍历查看结果
//构建霍夫曼数
public static Node2 buildHufuManTree(int[] arr)
//排序数组并构建成以Node为元素的List集合
List<Node2> list = buildListSort(arr);
System.out.println("未处理:"+list);
while (list.size() != 1)
//取出根节点权值最小的两颗二叉树
Node2 leftNode = list.get(0);
//取出根节点权值第二小的两颗二叉树
Node2 rightNode = list.get(1);
//构建新的二叉树
Node2 parent = new Node2(rightNode.value + leftNode.value);
parent.left = leftNode;
parent.right = rightNode;
list.add(parent);
//干掉原来的rightNode和leftNode
list.remove(leftNode);
list.remove(rightNode);
Collections.sort(list);
// System.out.println("第一次处理后:"+list);
System.out.println("处理结束:"+list);
return list.get(0);
//构建list并排序
private static List<Node2> buildListSort(int[] arr)
ArrayList<Node2> list = new ArrayList<>();
for (int i : arr)
list.add(new Node2(i));
Collections.sort(list);
return list;
/**
* 节点
*/
class Node2 implements Comparable<Node2>
public Node2 left;//左子节点
public Node2 right;//右子节点
public int value;//权值
public Node2(int value)
this.value = value;
@Override
public String toString()
return "Node2[value=" + value + "]";
@Override
public int compareTo(Node2 o)
//从小到大排序
return this.value - o.value;
//前序遍历
public void preList()
System.out.println(this);//先输出父节点
//递归向左前序遍历
if (this.left != null)
this.left.preList();
//递归向右前序遍历
if (this.right != null)
this.right.preList();
以上是关于Day578.霍夫曼树 -数据结构和算法Java的主要内容,如果未能解决你的问题,请参考以下文章