Exemple #1
0
            public HuffumanNode SelectNewNode(List <HuffumanNode> nodes, int i)
            {
                var currentNode = new HuffumanNode();

                var temp = nodes;

                nodes = nodes.Where(t => t.Parent == 0).OrderBy(t => t.Weigth).ThenBy(t => t.ID).ToList();
                if (nodes.Count == 0) //结束,构造最后一个节点,
                {
                    nodes = nodes.Where(t => t.Parent != 0).OrderByDescending(t => t.ID).ToList();
                    if (nodes.Count >= 2)
                    {
                        var node1 = nodes[0];
                        var node2 = nodes[1];
                        currentNode.ID         = i + 1;
                        currentNode.Weigth     = node1.Weigth + node2.Weigth;
                        currentNode.LeftChild  = node1.ID;
                        currentNode.RightChild = node2.ID;
                        currentNode.Parent     = 0;

                        node1.Parent = currentNode.ID;
                        node2.Parent = currentNode.ID;
                        return(currentNode);
                    }
                    else
                    {
                        return(default);
Exemple #2
0
            public void CreateTree()
            {
                //  List<int> values = new List<int>() { 7, 19, 2, 6, 32, 3, 21, 10 };
                // List<int> values = new List<int>() { 5, 29, 7, 8, 14, 23, 3, 11 };
                //  List<int> values = new List<int>() { 40, 30, 15, 5, 4, 3, 3 };
                List <int> values = new List <int>()
                {
                    45, 13, 12, 16, 9, 5
                };
                int weightCount = values.Count;

                int m = weightCount * 2 - 1;

                List <HuffumanNode> nodes = new List <HuffumanNode>();

                for (int i = 0; i < weightCount; i++)
                {
                    HuffumanNode node = new HuffumanNode();
                    node.Weigth     = values[i];
                    node.Parent     = 0;
                    node.LeftChild  = 0;
                    node.RightChild = 0;
                    node.ID         = i + 1;

                    nodes.Add(node);
                }

                // set tree
                // 2n-1
                //1.选取连个最小的
                //8
                for (int i = weightCount; i < m; i++)
                {
                    // find two min node
                    var node = SelectNewNode(nodes, i);

                    if (node != null)
                    {
                        Console.WriteLine($"{node.ID}:{node.Weigth}");
                        nodes.Add(node);
                    }
                }
                for (int i = 0; i < m; i++)
                {
                    var node = nodes[i];
                    Console.WriteLine($"ID:{node.ID} {node.Weigth} {node.Parent} {node.LeftChild} {node.RightChild}");
                }
            }