void FindLeafPatterns(Dictionary <byte, bool[]> leafPatterns, HuffmanNode node, Stack <bool> currentPattern)
        {
            var decision = node as HuffmanDecision;

            if (decision != null)
            {
                currentPattern.Push(true);
                FindLeafPatterns(leafPatterns, decision.Left, currentPattern);
                currentPattern.Pop();
                currentPattern.Push(false);
                FindLeafPatterns(leafPatterns, decision.Right, currentPattern);
                currentPattern.Pop();
            }
            else
            {
                var leaf = (HuffmanLeaf)node;
                leafPatterns.Add(leaf.Symbol, currentPattern.ToArray());
            }
        }
        public override int CompareTo(HuffmanNode other)
        {
            var probComp = Probability.CompareTo(other.Probability);

            if (probComp != 0)
            {
                return(probComp);
            }
            // Use size as tiebreaker to ensure a more balanced tree when probabilities match
            var sizeComp = Size.CompareTo(other.Size);

            if (sizeComp != 0)
            {
                return(sizeComp);
            }
            var casted = other as HuffmanLeaf;

            if (casted == null)
            {
                return(-1);
            }
            return(Symbol.CompareTo(casted.Symbol));
        }