【问题标题】:Leaves dissapearing in a binary tree [closed]叶子在二叉树中消失[关闭]
【发布时间】:2014-06-09 14:38:53
【问题描述】:

我正在尝试自制霍夫曼编码。我已经开始生成二叉树了,如果不是因为一个小缺陷的话。

当叶子超过一层深度时,它们就会消失。我的根节点将有孩子,但这些孩子的叶子将为 null。我相信这与没有保留参考文献有关,但两天后我似乎无法弄清楚。

    private HuffmanTree fillTree(PriorityQueue<HuffmanTree> _eQueue)
    {
        while (_eQueue.count > 1)
        {
            ///Dequeue children
            HuffmanTree node1 = _eQueue.Dequeue();
            HuffmanTree node2 = _eQueue.Dequeue();

            ///Create new parent
            HuffmanTree parent = new HuffmanTree();

            ///Set up relations
            parent.node_left = node1;
            parent.node_right = node2;
            node1.parent = parent;
            node2.parent = parent;

            ///Give parent the weight of it's children combined
            parent.weight = node1.weight + node2.weight;

            ///Reinsert parent into priority queue
            _eQueue.Enqueue(parent, parent.weight);
        }

        ///Return the last object in the queue
        return _eQueue.Dequeue();
    }

这是我用来生成霍夫曼树的代码。

    public HuffmanTree node_left { get; set; }
    public HuffmanTree node_right { get; set; }
    public HuffmanTree parent { get; set; }
    public int weight { get; set; }
    public char value { get; set; }

这些是类变量。

你们能帮帮我吗?

我的项目也在 github 上。如果你愿意,你可以去看看。

https://github.com/samynv/HufmanEncoding

所有工作都在 Dev 分支中完成。该代码在 createTree 函数中运行良好,但在 compressString 函数中无法运行。

【问题讨论】:

  • 对我来说很合适。您如何观察树的状态以确定它的深度仅为 1?
  • 我正在使用调试器观察我的值。当我尝试使用二叉树对字符串进行编码时,问题最初就开始了。出于某种原因,它从未生成具有值的节点。我用局部变量运行调试器并开始手动查看叶子。在深度一深之后它就消失了。
  • 您应该使用调试器来验证您的程序是否正在执行它应该执行的操作,或者如果您不确定,请查看它正在执行的操作。您不应该将它用作获取程序输出的主要手段;程序应该在没有调试器的情况下做到这一点。除其他问题外,如果您的程序实际上从未观察到某个值,那么编译器可以进行各种优化,例如,从不实际计算它。
  • 确实,Servy 提到,使用调试器手动遍历树并不总是那么可靠。不过,在您的具体示例中,我可以正确遍历它。

标签: c# encoding binary-tree huffman-code


【解决方案1】:

我检查了您的代码,它看起来应该可以工作。我还运行了你在 GitHub 上的代码,你的程序正确地构建了树。 fillTree 操作后生成的根具有正确的子级,多级深(而不是您所说的只有一级)。

当我检查结果值和它们的权重,并与这个在线 Huffman 编码演示 (http://courses.cs.washington.edu/courses/cse373/04sp/fullhuffmandemo.html) 交叉引用它们时,当我用你的句子“j'aime aller sur”运行你的程序时,我得到完全相同的权重并离开le bord de l'eau les jeudis ou les jours impairs"。

你确定你没有解释错你自己的树吗?

【讨论】:

  • 虽然实际的树生成工作正常,但实际压缩字符串时会出现问题。我开始在我的开发分支中进行这项工作。我认为问题出现在compressString函数中,并且在声明时没有正确复制值而在原始的CreateTree函数中,分支都是完整的,一旦进入compressString函数就被破坏了
  • 另外,我应该提到我的 dev 分支而不是 master 中的东西出了问题。我的错。
  • 我尝试将它从 dev 移植到 master。它现在确实有效。不是所有的树在两个深度之后都会突然归零。不过感谢您的检查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-21
  • 2015-08-05
  • 1970-01-01
  • 2021-09-03
  • 2016-01-17
相关资源
最近更新 更多