哈夫曼编码 C#

我是从《数据结构与算法 C#语言描述》这本书里面抄的 , 程序可以正常运行


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 哈夫曼编码1
{
    public class HuffmanTree
    {
        private HuffmanTree lChild;
        private HuffmanTree rChild;
        private string letter;
        private int freq;

        public HuffmanTree(string letter)
        {
            this.letter = letter;
            this.freq = 1;
        }

        public HuffmanTree LChild
        {
            get { return lChild; }
            set { lChild = value; }
        }

        public HuffmanTree RChild
        {
            get { return rChild; }
            set { rChild = value; }
        }

        public string Letter
        {
            get { return letter; }
            set { letter = value; }
        }

        public int Freq
        {
            get { return freq; }
            set { freq = value; }
        }

        public void IncFreq()
        {
            freq++;
        }


    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 哈夫曼编码1
{
    public class Node
    {
        public HuffmanTree data;
        public Node link;

        public Node(HuffmanTree newData)
        {
            data = newData;
        }

    }
}



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 哈夫曼编码1
{
    public class TreeList
    {
        private int count = 0;
        private Node first = null;
        private static string[] signTable = null;
        private static string[] keyTable = null;

        public TreeList(string input)
        {
            List<char> list = new List<char>();
            for (int i = 0; i < input.Length; i++)
            {
                if (!list.Contains(input[i]))
                {
                    list.Add(input[i]);    //如果不包含string里的字符,就加上去
                }
            }
            signTable = new string[list.Count];
            keyTable = new string[list.Count];
        }

        public string[] GetSignTable()
        {
            return signTable;
        }

        public string[] GetKeyTable()
        {
            return keyTable;
        }

        public void AddLetter(string letter)
        {
            HuffmanTree hTemp = new HuffmanTree(letter);
            Node eTemp = new Node(hTemp);
            if (first == null)
            {
                first = eTemp;
            }
            else
            {
                eTemp.link = first;
                first = eTemp;
            }
            count++;
        }

        public void SortTree()
        {
            if (first != null && first.link != null)
            {
                Node tmp1;
                Node tmp2;
                for (tmp1 = first; tmp1 != null; tmp1 = tmp1.link)
                {
                    for (tmp2 = tmp1.link; tmp2 != null; tmp2 = tmp2.link)
                    {
                        if (tmp1.data.Freq > tmp2.data.Freq)
                        {
                            HuffmanTree tmpHT = tmp1.data;
                            tmp1.data = tmp2.data;
                            tmp2.data = tmpHT;
                        }
                    }
                }//按照权重(freq)升序排列
            }
        }

        /// <summary>
        /// 去掉结点
        /// </summary>
        /// <returns>去掉的结点</returns>
        public HuffmanTree RemoveTree()
        {
            if (first != null)
            {
                HuffmanTree hTmp;
                hTmp = first.data;
                first = first.link;
                count--;
                return hTmp;
            }
            return null;
        }

        /// <summary>
        /// 插入结点
        /// </summary>
        /// <param name="hTmp">等待插入的结点</param>
        public void InsertTree(HuffmanTree hTmp)
        {
            Node eTmp = new Node(hTmp);
            if (first == null)
            {
                first = eTmp;
            }
            else
            {
                Node p = first;
                while (p.link != null)
                {
                    if (p.data.Freq <= hTmp.Freq
                        && p.link.data.Freq >= hTmp.Freq)
                    {
                        break;
                    }
                    p = p.link;
                }
                eTmp.link = p.link;
                p.link = eTmp;
            }
            count++;
        }

        /// <summary>
        /// 合并成一棵树
        /// </summary>
        public void MergeTree()
        {
            if (first != null)
            {
                if (first.link != null)
                {
                    HuffmanTree aTmp = RemoveTree();
                    HuffmanTree bTmp = RemoveTree();
                    HuffmanTree sumTmp = new HuffmanTree("x");
                    sumTmp.LChild = aTmp;
                    sumTmp.RChild = bTmp;
                    sumTmp.Freq = aTmp.Freq + bTmp.Freq;
                    InsertTree(sumTmp);
                }
            }
        }

        public int Lenght()
        {
            return count;
        }

        /// <summary>
        /// 增加字符
        /// </summary>
        /// <param name="str">等待增加的字符</param>
        public void AddSign(string str)
        {
            if (first == null)
            {
                AddLetter(str);
                return;
            }
            Node tmp = first;
            while (tmp != null)
            {
                if (tmp.data.Letter == str)
                {
                    tmp.data.IncFreq();
                    return;
                }
                tmp = tmp.link;
            }
            AddLetter(str);
        }

        static public string Translate(string original)
        {
            string newStr = "";
            for (int i = 0; i < original.Length; i++)
            {
                for (int j = 0; j < signTable.Length; j++)
                {
                    if (original[i].ToString() == signTable[j])
                    {
                        newStr += keyTable[j];
                    }
                }
            }
            return newStr;
        }

        static int pos = 0;
        static public void MakeKey(HuffmanTree tree, string code)
        {
            if (tree.LChild == null)
            {
                signTable[pos] = tree.Letter;
                keyTable[pos] = code;
                pos++;
            }
            else
            {
                MakeKey(tree.LChild, code + "0");
                MakeKey(tree.RChild, code + "1");
            }
        }

    }
}



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 哈夫曼编码1
{
    class Program
    {
        static void Main(string[] args)
        {
            string input;
            Console.Write("Enter a string to encode :  ");
            input = Console.ReadLine();
            TreeList treeList = new TreeList(input);
            for (int i = 0; i < input.Length; i++)
            {
                treeList.AddSign(input[i].ToString());
            }
            treeList.SortTree();
            while (treeList.Lenght() > 1)
            {
                treeList.MergeTree();
            }
            TreeList.MakeKey(treeList.RemoveTree(), "");
            string newStr = TreeList.Translate(input);
            string[] signTable = treeList.GetSignTable();
            string[] keyTable = treeList.GetKeyTable();

            for (int i = 0; i < signTable.Length; i++)
            {
                Console.WriteLine(signTable[i] + ": " + keyTable[i]);
            }

            Console.WriteLine("The original string is " + input.Length * 16 + "bits long . ");
            Console.WriteLine("the new string is " + newStr.Length + "bits long  . ");
            Console.WriteLine("The coded string looks like this : " + newStr);

            Console.Read();
        }
    }
}



  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值