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