using System;
using System.Collections.Generic;
using System.Linq;
namespace 哈夫曼树
{
class Program
{
public static List<HuffmanNode> huffmanNodes= new List<HuffmanNode>();//哈夫曼树节点集合
public static List<Node> nodes = new List<Node>();//基本节点集合 只有数值和权重
static void Main(string[] args)
{
//添加节点(权重,字符)
nodes.Add(new Node(5, "a"));
nodes.Add(new Node(32, "b"));
nodes.Add(new Node(18, "c"));
nodes.Add(new Node(7, "d"));
nodes.Add(new Node(25, "e"));
//将每个节点转换成哈夫曼树的节点
foreach (var node in nodes)
{
HuffmanNode huffman = new HuffmanNode();
huffman.value = node.Value;
huffman.weight = node.Weight;
huffmanNodes.Add(huffman);
}
//生成哈夫曼树
while (huffmanNodes.Count > 1)
{
//将所有节点按权重升序排序
var sort =
from node in huffmanNodes
orderby node.weight
select node;
//选出权重最小的两个节点
var min = sort.Take(2).ToArray();
//生成一个父节点 权重为两个权重最小节点的权重和
HuffmanNode huffman = new HuffmanNode();
huffman.weight = min[0].weight + min[1].weight;
huffman.left = min[0];
huffman.right = min[1];
//为两个权重最小节点添加父节点
min[0].parent = huffman;
min[1].parent = huffman;
//在集合中移除两个最小节点
huffmanNodes.Remove(min[0]);
huffmanNodes.Remove(min[1]);
//将父节点添加进集合中
huffmanNodes.Add(huffman);
}
visitTree(huffmanNodes[0], " "," " );
Console.ReadKey();
}
//哈夫曼编码输出 左子树为0 右子树为1
public static void visitTree(HuffmanNode node, String prefixStr, String addStr)
{
if (node != null)
{
if (!string .IsNullOrEmpty(node.value))
Console.WriteLine(node.value.ToString() + ":" + prefixStr + addStr);
visitTree(node.left, prefixStr + addStr, "0");
visitTree(node.right, prefixStr + addStr, "1");
}
}
}
/// <summary>
/// 定义个Node节点类 用于添加操作
/// </summary>
public class Node
{
public int Weight { get; set; }//权重
public String Value { get; set; }//值
public Node(int weight, string value)
{
Weight = weight;
Value = value;
}
}
/// <summary>
/// 哈夫曼树节点类
/// </summary>
public class HuffmanNode
{
public int weight;//权重
public String value = "";//值
public HuffmanNode parent;//父节点
public HuffmanNode left;//左孩子
public HuffmanNode right;//右孩子
}
}
哈夫曼树
最新推荐文章于 2022-01-06 17:07:44 发布