public void BuildTree(byte[] source = null) { nodes.Clear(); if (source != null) { frequencies.Import(source); } foreach (KeyValuePair<byte, int> symbol in frequencies.Frequencies) { nodes.Add(new Node { Symbol = symbol.Key, Frequency = symbol.Value }); } while (nodes.Count > 1) { List<Node> orderedNodes = nodes.OrderBy(node => node.Frequency).ThenBy(node => node.Symbol).ToList(); if (orderedNodes.Count >= 2) { List<Node> takenNodes = orderedNodes.Take(2).ToList(); Node parent = new Node { Frequency = takenNodes[0].Frequency + takenNodes[1].Frequency, Left = takenNodes[0], Right = takenNodes[1] }; nodes.Remove(takenNodes[0]); nodes.Remove(takenNodes[1]); nodes.Add(parent); leafCount++; } } root = nodes.FirstOrDefault(); }
private void processNode(Node node, List<bool> data) { if (node.Left == null && node.Right == null) { if (data.Count == 0) { data.Add(true); data.Add(false); } data.Add(true); data.Add(true); byte mask = 0x80; for (int i = 0; i < 8; i++) { data.Add((node.Symbol & mask) == mask); mask >>= 1; } data.Add(false); data.Add(false); } else { data.Add(true); data.Add(false); if (node.Left != null) { processNode(node.Left, data); } if (node.Right != null) { processNode(node.Right, data); } } }