zoukankan      html  css  js  c++  java
  • C#求解哈夫曼树

     
    C#求解哈夫曼树,树是用数组保存的
    
      class HuffmanTree
        {
            private Node[] data;
            public int LeafNum { get; set; }
            public Node this[int index]
            {
                get { return data[index]; }
                set { data[index] = value; }
            }
            public HuffmanTree(int n) 
            {
                data = new Node[2 * n - 1];
                for (int i = 0; i < 2 * n - 1; i++)
                {
                    data[i] = new Node();
                }
                LeafNum = n;
            }
            public void Create(List<int> list)
            {
                int min1;
                int min2;
                int tmp1, tmp2;
                for (int i = 0; i < list.Count; i++)
                {
                    data[i].Weight = list[i];
                }               
                for (int i = 0; i < LeafNum-1; i++)
                {
                    min1 = min2 = int.MaxValue;
                    tmp1 = tmp2 = 0;
    
                   //获取数组中最小的2个值
                    for (int j = 0; j < LeafNum + i; j++)
                    {
                        if (data[j].Weight<min1&&data[j].Parent == -1)
                        {
                            min2 = min1;
                            tmp2 = tmp1;
                            min1 = data[j].Weight;
                            tmp1 = j;
                        }
                       else if (data[j].Weight < min2 && data[j].Parent == -1)
                        {
                            min2 = data[j].Weight;
                            tmp2 = j;
                        }                 
                    }
                    data[tmp1].Parent = this.LeafNum + i;
                    data[tmp2].Parent = this.LeafNum + i;
                    data[this.LeafNum + i].Weight = data[tmp1].Weight + data[tmp2].Weight;
                    data[this.LeafNum + i].LChild = tmp1;
                    data[this.LeafNum + i].RChild = tmp2;
                }
            }
    
    
    //树的结点(树是用数组保存的)  
    
    public class Node
        {
            public int Weight { get; set; }//权值
            public int LChild { get; set; }//左孩子在数组中的位置
            public int RChild { get; set; }//右孩子在数组中的位置
            public int Parent { get; set; }//父节点在数组中的位置
            public Node()
            {
                Weight = 0;
                LChild = -1;
                RChild = -1;
                Parent = -1;//-1表示没有
            }
            public Node(int weight,int lChild,int rChild,int parent )
            {
                this.Weight = weight;
                this.LChild = lChild;
                this.RChild = rChild;
                this.Parent = parent;
            }
        }
  • 相关阅读:
    codility上的问题(15) Xi 2012
    HDU 4350 Card
    如何在SourceInsight中选中匹配的大括号中的内容
    Codility上的问题 (16) Omicron 2012
    WPF的MVVM
    html5的自定义data-*属性和jquery的data()方法的使用
    hdu 4635 Strongly connected(强连通+缩点)
    HDU3709:Balanced Number(数位DP+记忆化DFS)
    NGUI: Documentation
    Android到您的计算机使用命令行屏幕捕获和出口
  • 原文地址:https://www.cnblogs.com/wxj111/p/3035395.html
Copyright © 2011-2022 走看看