C# 如何绕过哈夫曼树并获得符号代码?

C# 如何绕过哈夫曼树并获得符号代码?,c#,tree,huffman-code,C#,Tree,Huffman Code,我有一个绕过哈夫曼树的递归函数 我需要得到一个字符串,其中包含每个符号的所有代码 private void BypassLCR(HuffmanTree node, ref string result) { if (node.Symbol != '\0') { result += string.Format(" -> {0}| ", node.Symbol); return; } string last = result;

我有一个绕过哈夫曼树的递归函数

我需要得到一个字符串,其中包含每个符号的所有代码

private void BypassLCR(HuffmanTree node, ref string result)
{
    if (node.Symbol != '\0')
    {
        result += string.Format(" -> {0}| ", node.Symbol);
        return;
    }

    string last = result;
    result += "0";
    BypassLCR(node.Left, ref result);

    last += "1";
    result += last;
    BypassLCR(node.Right, ref result);
}
属性
节点。当节点不是叶时,默认情况下,Symbol
'\0'

例如,我有一个包含
'r'
'o'
'b'
'a'
符号的文本。其代码分别为:00、01、10和11

那么输出将是:

00->r | 01->o |10->b |00->r | 01->o |11->a |


我知道问题是
last
保留了关于子子树的旧数据。但是在代码中的什么地方可以清除它呢?

这对您有用吗

private string TraverseLCR(HuffmanTree node, string code)
{
    if (IsLeaf(node))
        return $"{code} -> {node.Symbol}| ";

    var leftSubtreeResult = TraverseLCR(node.Left, code + "0");
    var rightSubtreeResult = TraverseLCR(node.Right, code + "1");
    return leftSubtreeResult + rightSubtreeResult;
}

private bool IsLeaf(HuffmanTree node) => node.Symbol != '\0';
用法:

var allCodes = TraverseLCR(treeRoot, string.Empty);