如何绕过霍夫曼树并获得符号代码?

时间:2018-04-21 15:11:49

标签: 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;
    result += "0";
    BypassLCR(node.Left, ref result);

    last += "1";
    result += last;
    BypassLCR(node.Right, ref result);
}

默认情况下,当节点不是叶子时,属性node.Symbol'\0'

例如,我的文字包含'r''o''b''a'符号。他们的代码分别为00,01,10和11。

然后输出为:

  

00 - > [R | 01 - > o | 10 - > C | 00 - > [R | 01 - > o | 11 - > A |。

我知道问题是last保留有关子子树的旧数据。但是在代码清除它的地方呢?

1 个答案:

答案 0 :(得分:0)

这对你有用吗?

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