c - 如何递归遍历哈夫曼树以搜索特定元素? - C

标签 c recursion huffman-code

我正在使用霍夫曼编码,目前正处于将文本文件编码/解码为二进制文件的阶段。我有这段代码可以从树中检索一个节点及其所有相关数据(字符、频率、路径):

EmptyString ( string );
while ( ( c = fgetc ( nameTextFile ) ) != EOF ) {
    nodeHuffmanTree = SearchHuffmanTree ( rootHuffmanTree, c );
    strcpy ( string, nodeHuffmanTree -> route );
    Encode ( nameBinaryFile, string );
    EmptyString ( string );
}

假设已经为每个节点(0 和 1)生成了路由。我想要的 SearchHuffmanTree 函数是,给定一个字符,它在哈夫曼树中搜索所述字符,并返回包含它的节点。这是相关的,因为该节点将包含 Encode 函数将转换为字节的路由。

我知道我不能像二叉搜索树一样对待霍夫曼树,因为它不具有相同的特征,所以如果我想搜索特定字符,我将不得不遍历整棵树。

我已经在寻找不使用递归(和一些堆栈)的替代方案,虽然它们更容易理解,但它们产生的代码却相当不简单和干净,所以我更喜欢使用递归的解决方案。

我已经弄清楚了编码/解码部分,所以这几乎是最终完成我的代码的最后一步。期待您能给我的任何帮助。

最佳答案

是的,您不能假设任何特定节点(即字符)在树中的位置,因为节点的位置取决于字符的频率而不是它们的值。因此,您必须找到一种方法来遍历整棵树,而不做任何假设。

通常有两种遍历图的方法:基于队列的广度优先搜索 (BFS) 和基于堆栈的深度优先搜索 (DFS)。

由于 DFS 是基于堆栈的,所以它本质上是一个递归问题。此外,由于 2 种方法遍历树的方式不同,DFS 在您的情况下平均效率更高。

DFS 是如何工作的?

嗯,基本原则是,如果一个节点不是叶节点,则对其每个子节点执行 DFS。如果选择遍历子树的顺序,则可以先走概率最高的路径,这会增加更快找到结果的机会。

下面是一个简单的算法伪代码:

DFS(node T, char x) {
    if (T is leaf)
        if (T == x)
            return found
        else
            return not found
    else
        foreach child of T
            if DFS(child, x) == found
                return found
        return not found

您可以在 DFS 的维基百科页面上找到更多详细信息.

关于c - 如何递归遍历哈夫曼树以搜索特定元素? - C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34406972/

相关文章:

c - 使用浮点常量和变量的 'printf' 参数 1 的类型不兼容

c - 如何打印 5 字节整数值?

c++ - 这个递归函数是如何工作的?合并排序两个单链表

types - 这种模式似乎很详尽,但我仍然收到警告

algorithm - 是否有数学证明霍夫曼编码是最有效的无损压缩算法?

priority-queue - Java优先级队列: How to ensure that new nodes are inserted first if natural order (compareTo) is the same?

c - 管道:如何确保我是否成功写入管道?

c - 以下两个实现之间的基本区别是什么?

c - 错误: void value not ignored - in simple c program

java - 构建霍夫曼树