【校招VIP】赫夫曼树

05月12日 收藏 0 评论 1 java开发

【校招VIP】赫夫曼树

转载声明:文章来源https://blog.csdn.net/wuxudong12138/article/details/100032443

一、赫夫曼树:最优二叉树

赫夫曼树定义了一个WPL值,这个值等于所有叶子节点的带权路径之和。
例如:下面的三个树,我们可以分别计算出他们的WPL值。
我们可以看到不同的树结构,对应了不同的WPL值,我们把WPL值最小的树称为赫夫曼树。
从第二张图,我们可以看出权值越大的节点离根节点越近,越小的节点离根节点越远。


二、赫夫曼树的构造

对于这个数组,我们把它构造成赫夫曼树

[5,29,7,8,14,23,3,11]

第一步:我们创建节点类,这些值作为节点的权值,存储在集合里。

第二步:将这些节点按照权值的大小进行排序。

第三步:取出权值最小的两个节点,并创建一个新的节点作为这两个节点的父节点,这个父节点的权值为两个子节点的权值之和。将这两个节点分别赋给父节点的左右节点。

第四步:删除这两个节点,将父节点添加进集合里。

第五步:重复第二步到第四步,直到集合中只剩一个元素,结束循环。

三、代码实现

package com.wuxudong.HuffmanTree;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class HuffmanTree {
public static void main(String[] args) {
int [] arr=new int[]{8,11,23,29,14,7,3,5};

Node node=huffman(arr);
node.frontShow();
}

private static Node huffman(int[] arr) {
//创建一个集合存储二叉数
List<Node> nodes=new ArrayList<Node>();

for (int value:arr){
nodes.add(new Node(value));
}

while (nodes.size()>1) {
//对集合进行排序
Collections.sort(nodes);
//取出最小的节点
Node left=nodes.get(nodes.size()-1);

//取出次小的节点
Node right=nodes.get(nodes.size()-2);

//新建一个根节点
Node parent=new Node(left.value+right.value);
parent.left=left;
parent.right=right;

//删除两个节点
nodes.remove(left);
nodes.remove(right);

//将根节点添加进集合中
nodes.add(parent);

}


return nodes.get(0);

}


}

package com.wuxudong.HuffmanTree;

public class Node implements Comparable<Node>{
int value;
Node left;
Node right;
public Node(int value){
this.value=value;
}

public int compareTo(Node o) {
return -(this.value-o.value);
}

@Override
public String toString() {
return "Node{" +
"value=" + value +
'}';
}

//前序遍历
public void frontShow(){
System.out.println(value);
if(left!=null){
left.frontShow();
}
if (right!=null){
right.frontShow();
}
}
}


C 1条回复 评论
C李要控制李寄几

学习学习学习

发表于 2022-08-18 21:00:00
0 0