【问题标题】:Building a tree from preorder in C++在 C++ 中从预购构建一棵树
【发布时间】:2013-11-18 02:20:27
【问题描述】:

我正在处理压缩/解压缩任务。我正在尝试编写一个 C++ 方法来使用压缩文件头中的以下前序遍历来构建树: 001c1b01a01e1d 0 表示内部节点,而 1 表示叶子。每次创建节点时,我都会将该节点的代码设置为 0 或 1,因为我将使用另一种方法来解码树,并且它必须知道如何使用这些代码遍历不同的边。每当我在前序遍历字符串中达到 1 时,我将节点的“符号”字段设置为前序字符串中的以下字符。我无法让它工作。任何人都可以帮忙吗?这是我的代码(“bitsToRead”只表示预购字符串的长度,因此该方法知道何时停止)谢谢!

void HCTree::buildFromHeader(ifstream& in, HCNode* n, int codeToUse) {

   if( bitsToRead > 0) {
      char c = in.get();
      bitsToRead--;
      if(c == '0') {
         n = new HCNode(0, 0, 0, 0, 0, codeToUse);
         if(rootSet == 0) {
            root = n;
            rootSet = true;
         }
         HCNode* left;
         n->c0 = left;
         HCNode* right;
         n->c1 = right;
         buildFromHeader(in, left, 0);
         buildFromHeader(in, right, 1);
      }
      else { 
         byte symbol = in.get();
         n = new HCNode(0, symbol, 0, 0, 0, codeToUse);
         bitsToRead--;
         n->c0 = n->c1 = NULL;
      }
   }
}

【问题讨论】:

    标签: c++ binary-tree compression preorder


    【解决方案1】:

    好像变了

    void HCTree::buildFromHeader(ifstream& in, HCNode* n, int codeToUse) {
    

    void HCTree::buildFromHeader(ifstream& in, HCNode* &n, int codeToUse) {
    

    会做的。

    加上rootSet 逻辑可以省略。你只要打电话

    buildFromHeader(in, root, codeToUse)
    

    来自调用者。

    编辑:

    我首先误读了您的代码。 n = new HCNode(0, symbol, 0, 0, 0, codeToUse); 是让我建议使用参考的代码。因为您在这里要做的是更改从叶子的祖先传递的指针(n->c0 = leftn->c1 = right 的东西)。为了让整个事情发挥作用,除了上面的改变,改变

    HCNode* left;
    n->c0 = left;
    HCNode* right;
    n->c1 = right;
    buildFromHeader(in, left, 0);
    buildFromHeader(in, right, 1);
    

    buildFromHeader(in, n->c0, 0);
    buildFromHeader(in, n->c1, 0);
    

    这将让被调用者使用引用透明地将值分配给struct 内的指针。

    【讨论】:

    • 嗯,感谢您的帮助,但它不起作用.. 为什么您建议从 HCNode* n 更改为 HCNode* &n ??
    • 抱歉,我误读了您的部分代码,已更新答案,希望现在是正确的。
    • 谢谢!我终于得到了一些输出!
    猜你喜欢
    • 1970-01-01
    • 2020-04-29
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    相关资源
    最近更新 更多