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);
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}"); } }