1. 程式人生 > >哈夫曼樹 C#

哈夫曼樹 C#

這是我從網上抄來的,可以正常執行

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

namespace 課本作業4_18第一次
{
    public class Node
    {
        private int weight;
        private int lChild;
        private int rChild;
        private int parent;
        private string data;

        public int Weight
        {
            get { return weight; }
            set { weight = value; }
        }

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

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

        public int Parent
        {
            get { return parent; }
            set { parent = value; }
        }

        public string Data
        {
            get { return data; }
            set { data = value; }
        }
        
        public Node()
        {
            weight = 0;
            lChild = -1;
            rChild = -1;
            parent = -1;
            data = "";
        }

        public Node(int w, int lc, int rc, int p ,string d)
        {
            weight = w;
            lChild = lc;
            rChild = rc;
            parent = p;
            data = d;
        }


    }
}


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

namespace 課本作業4_18第一次
{
    public class HuffmanTree
    {
        private Node[] data;
        private int leafNum;

        public Node this[int index]
        {
            get { return data[index]; }
            set { data[index] = value; }
        }

        public int LeafNum
        {
            get { return leafNum; }
            set { leafNum = value; }
        }

        public HuffmanTree(int n)
        {
            data = new Node[2 * n - 1];
            for (int i = 0; i < data.Length; i++)
            {
                data[i] = new Node();
            }
            leafNum = n;
        }

        public void Create()
        {
            int min1;
            int min2;
            int temp1;
            int temp2;

            Console.WriteLine("請輸入{0}個葉子結點的權值", leafNum);
            for (int i = 0; i < leafNum; i++)
            {
                Console.Write("第{0}個為:", i);
                string s = Console.ReadLine();
                int temp = int.Parse(s);
                data[i].Weight = temp;
            }

            Console.WriteLine("請輸入{0}個葉子結點的字元內容", leafNum);
            for (int i = 0; i < leafNum; i++)
            {
                Console.Write("第{0}個為:", i);
                string s = Console.ReadLine();
                data[i].Data = s;
            }

            for (int i = 0; i < this.leafNum - 1; i++)
            {
                min1 = Int32.MaxValue;
                min2 = int.MaxValue;
                temp1 = 0;
                temp2 = 0;
                for (int j = 0; j < leafNum + i; j++)
                {
                    if ((data[j].Weight < min1) && (data[j].Parent == -1))
                    {
                        min2 = min1;
                        temp2 = temp1;
                        temp1 = j;
                        min1 = data[j].Weight;
                    }
                    else if ((data[j].Weight < min2) && (data[j].Parent == -1))
                    {
                        min2 = data[j].Weight;
                        temp2 = j;
                    }
                }
                data[temp1].Parent = leafNum + i;
                data[temp2].Parent = leafNum + i;
                data[leafNum + i].Weight = data[temp1].Weight + data[temp2].Weight;
                data[leafNum + i].LChild = temp1;
                data[leafNum + i].RChild = temp2;
            }

            foreach (var item in data)
            {
                Console.WriteLine("data:" + item.Data +
                    "   parent:" + item.Parent.ToString() +
                    "  weight:" + item.Weight.ToString() +
                    "   LChild:" + item.LChild.ToString() +
                    "   RChild:" + item.RChild.ToString());
            }

        }

 

    }
}


    static void Main(string[] args)
        {

            HuffmanTree t = new HuffmanTree(4);
            t.Create();

            Console.Read();
        }