如何绕过霍夫曼树并获取符号代码?
How to bypass Huffman tree and get codes of symbols?
我有一个绕过一些霍夫曼树的递归函数。
我需要得到一个包含每个交易品种所有代码的字符串。
private void BypassLCR(HuffmanTree node, ref string result)
{
if (node.Symbol != '[=10=]')
{
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
默认为 '[=12=]'
。
例如,我有一个包含 '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 != '[=10=]';
用法:
var allCodes = TraverseLCR(treeRoot, string.Empty);
我有一个绕过一些霍夫曼树的递归函数。
我需要得到一个包含每个交易品种所有代码的字符串。
private void BypassLCR(HuffmanTree node, ref string result)
{
if (node.Symbol != '[=10=]')
{
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
默认为 '[=12=]'
。
例如,我有一个包含 '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 != '[=10=]';
用法:
var allCodes = TraverseLCR(treeRoot, string.Empty);