前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面试官:来,手写一个赫夫曼树

面试官:来,手写一个赫夫曼树

作者头像
shengjk1
发布2020-06-08 09:39:37
6530
发布2020-06-08 09:39:37
举报
文章被收录于专栏:码字搬砖
基本介绍
  1. 带权路径长度最短的树,权值较大的节点离根越近
  2. 路径和路径长度: 在一颗树中,从一个节点往下可以达到孩子或孙子节点之间的通路,称为路径。通路中分支的数目称为路径长度。如果规定根节点层数为1,则从根节点到第L层节点的路径长度为 L-1
  3. 节点的权及带权路径长度 若树中节点赋给一个有这某种含义的数值,则这个数值就是该节点的权。从节点到该节点之间的路径长度与该节点的乘积称带权路径长度
  4. 数的带权路径长度 所有叶子节点的带权路径长度之和,记为 wpl,权值越大的节点离根节点越近的二叉树才是最优二叉树
构建赫夫曼树
步骤
  1. 从小到大排序,将每个节点看成一颗简单的二叉树
  2. 取出节点权值最小的两颗二叉树
  3. 组成一颗新的二叉树,该新的二叉树的根节点的权值是前面两颗二叉树根节点权值的和
  4. 再将这颗新的二叉树,以根节点的权值大小再次排序,不断重复1-3步骤,直到数列中所有的数据都被处理。
代码
代码语言:javascript
复制
package xmht.datastructuresandalgorithms.datastructure.tree.huffmantree;

import org.jetbrains.annotations.NotNull;

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

/**
 * @author shengjk1
 * @date 2020/6/7
 */
public class HuffmanTree {
	
	public static void main(String[] args) {
		int[] arr = {13, 7, 8, 3, 29, 6, 1};
		Node root = createHuffmanTree(arr);
		preOrder(root);
	}
	
	
	public static void preOrder(Node root) {
		if (root != null) {
			root.preOrder();
		}
	}
	
	
	/**
	 * 1.从小到大进行排序,每个数据都是一个节点,每个节点都可以看成一颗简单的二叉树
	 * 2.取出根节点权值最小的两颗二叉树
	 * 3.组成一颗新的二叉树,该新的二叉树的根节点的权值是前面两颗二叉树根节点权值的和
	 * 4.再将这个新的二叉树以根节点的权值再次排序,不断重复
	 *
	 * @param arr
	 * @return
	 */
	public static Node createHuffmanTree(int[] arr) {
		ArrayList<Node> nodes = new ArrayList<>();
		for (int value : arr) {
			nodes.add(new Node(value));
		}
		
		while (nodes.size() > 1) {
			Collections.sort(nodes);
			
			//取出 根节点 权值最小的两颗二叉树
			//1.取出权值最小的节点
			Node leftNode = nodes.get(0);
			Node rightNode = nodes.get(1);
			
			Node parent = new Node(leftNode.value + rightNode.value);
			parent.left = leftNode;
			parent.right = rightNode;
			
			//从 ArrayList 删除处理过的二叉树
			nodes.remove(leftNode);
			nodes.remove(rightNode);
			
			//将 parent 加入到 nodes
			nodes.add(parent);
		}
		
		return nodes.get(0);
	}
}


//创建节点
class Node implements Comparable<Node> {
	int value; //节点权值
	Node left;
	Node right;
	
	public Node(int value) {
		this.value = value;
	}
	
	
	public void preOrder() {
		System.out.println(this);
		if (this.left != null) {
			this.left.preOrder();
		}
		
		if (this.right != null) {
			this.right.preOrder();
		}
	}
	
	@Override
	public String toString() {
		return "Node[" +
				"value=" + value +
				']';
	}
	
	@Override
	public int compareTo(@NotNull Node o) {
		//从小到大排
		return this.value - o.value;
	}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/06/07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基本介绍
  • 构建赫夫曼树
    • 步骤
      • 代码
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档