在C ++中从预订中构建树

时间:2013-11-18 02:20:28

标签: c++ binary-tree compression preorder

我正在进行压缩/解压缩分配。我正在尝试编写一个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;
      }
   }
}

1 个答案:

答案 0 :(得分:0)

似乎正在改变

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

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