Exemplo n.º 1
0
        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();
        }
Exemplo n.º 2
0
        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); }
            }
        }