C#求解哈夫曼树,实例代码

C#求解哈夫曼树,实例代码

什么是哈夫曼树?

哈夫曼树是一种二叉树,它的权值在叶子节点处,而非根节点处。它是一种带权路径长度最短的树,被广泛应用在文件压缩和编码中。

求解哈夫曼树的过程

求解哈夫曼树的过程分为三步:

  1. 构建森林:将每一个权值看做一个点,将所有点作为森林的初始状态。

  2. 构建哈夫曼树:对于森林中的每一对最小权值节点,合并它们并将合并后的点重新放回森林。

  3. 重复步骤2,直到森林中只剩下一颗哈夫曼树为止。

实现代码

下面给出用C#实现求解哈夫曼树的代码示例:

public class Node
{
    public int Value { get; set; }
    public Node Left { get; set; }
    public Node Right { get; set; }
}

public static Node Huffman(int[] weight)
{
    var nodes = new List<Node>();
    foreach (var w in weight)
    {
        nodes.Add(new Node { Value = w });
    }

    while (nodes.Count > 1)
    {
        var orderedNodes = nodes.OrderBy(n => n.Value).ToList();

        if (orderedNodes.Count >= 2)
        {
            var taken = orderedNodes.Take(2).ToList();
            var first = taken[0];
            var second = taken[1];

            var sum = new Node { Value = first.Value + second.Value, Left = first, Right = second };
            nodes.Remove(first);
            nodes.Remove(second);
            nodes.Add(sum);
        }
    }

    return nodes.FirstOrDefault();
}

示例说明

示例1

假设有如下权值数组:

var weight = new[] { 2, 3, 4, 6, 8, 10 };

经过上述求解哈夫曼树的代码计算,得到的哈夫曼树如下:

        33
       /  \
     14    19
    / \    / \
   6   8  10  9

示例2

假设有如下权值数组:

var weight = new[] { 9, 12, 6, 3, 5, 15 };

经过上述求解哈夫曼树的代码计算,得到的哈夫曼树如下:

         50
       /    \
     21      29
    /  \    /  \
   9   12  6    23
         / \   / \
        3   5 15  8

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#求解哈夫曼树,实例代码 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • 精妙的SQL和SQL SERVER 与ACCESS、EXCEL的数据导入导出转换

    精妙的SQL和SQL SERVER 与ACCESS、EXCEL的数据导入导出转换攻略 本文将详细介绍如何实现SQL SERVER与ACCESS、EXCEL之间的数据导入导出转换,包括建立连接、执行SQL查询、导入导出数据等。 建立连接 要在SQL SERVER中操作ACCESS或EXCEL数据,必须先建立连接。在SQL SERVER中,可以使用ODBC数据源…

    C# 2023年6月8日
    00
  • C# 可空类型的具体使用

    C# 可空类型是一种特殊的数据类型,允许变量的值为空。这在处理一些场景时非常有用,例如数据库中某些字段允许为空值,或者某些函数的返回值可能为空。 可空类型的定义 在 C# 中,可空类型通过在数据类型后面添加一个问号(?)来定义,例如 int? 定义了一个可空的整数类型,其值可以为 null 或者整数值。 判断可空类型是否为 null 要判断一个可空类型变量是…

    C# 2023年5月31日
    00
  • selenium.chrome写扩展拦截或转发请求功能

    针对selenium.chrome写扩展拦截或转发请求功能的完整攻略,包括以下步骤: 步骤一:安装Selenium和ChromeDriver 在使用Selenium对Chrome进行操作之前,需要先安装Selenium和ChromeDriver。具体方法如下: 安装Selenium pip install selenium 安装ChromeDriver 在官…

    C# 2023年5月31日
    00
  • C# 正则表达式常用的符号和模式解析(最新推荐)

    C# 正则表达式常用的符号和模式解析(最新推荐) 前言 正则表达式是一种灵活有强大的工具,可用于输入验证、搜索替换以及字符串处理等方面。在C#编程中,正则表达式提供了非常好用而且高效的支持。本文将详细讲解C#中正则表达式的常用符号和模式,帮助大家更好地掌握正则表达式的使用。 常用的符号 普通字符 普通字符是指没有特殊含义的字符,比如数字、字母、特殊字符等等。…

    C# 2023年5月15日
    00
  • linq中的分组操作符

    当需要对查询结果进行分组时,我们可以使用LINQ中的分组操作符。常用的分组操作符有GroupBy、ToLookup等。 GroupBy操作符 GroupBy操作符将一个序列按照指定条件分成多个组,并返回每个组及其对应的元素集合。其语法为: IEnumerable<IGrouping<TKey, TSource>> GroupBy&lt…

    C# 2023年6月1日
    00
  • 详解Java类库的概念以及import的使用方法

    详解Java类库的概念以及import的使用方法 Java类库是Java语言中预定义的一组类和接口,它们提供了各种各样的功能,例如字符串处理、文件操作、网络通信等。在Java程序中,我们可以使用import语句来引入需要使用的类库。本文将提供详细的“Java类库的概念以及import的使用方法”的完整攻略,包括如何理解Java类库的概念,以及如何使用impo…

    C# 2023年5月15日
    00
  • C#之CLR内存字符串常量池(string)

    C#之CLR内存字符串常量池(string)攻略 在C#中,字符串是一个常见的数据类型。CLR会对字符串做一些特殊处理来提高性能和节省内存。在CLR中,有一种特殊的内存区域叫做字符串常量池(string),它可以用来保存字符串,这些字符串是不可修改的,被称为常量。这篇攻略将会介绍CLR内存字符串常量池。 字符串常量池的工作原理 CLR会在应用程序启动的时候创…

    C# 2023年5月31日
    00
  • CommunityToolkit.Mvvm8.1 viewmodel使用-旧式写法(2)

      本系列文章导航 https://www.cnblogs.com/aierong/p/17300066.html https://github.com/aierong/WpfDemo (自我Demo地址)     0.说明 CommunityToolkit.Mvvm8.1有一个重大更新的功能:源生成器功能,它极大简化我们的mvvm代码 但是本篇先总结一下原…

    C# 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部