在C++中从预购中构建一棵树

Building a tree from preorder in C++

本文关键字:构建 一棵树 C++      更新时间:2023-10-16

我正在做压缩/解压缩作业。我正在尝试编写一个C++方法,从压缩文件的标头使用以下预序遍历来构建树:001C1B01A01E1D0 表示内部节点,而 1 表示叶。每次创建节点时,我都会将该节点的代码设置为 0 或 1,因为我将使用另一种方法来解码树,并且它必须知道如何使用这些代码遍历不同的边。每当我在预购遍历字符串中达到 1 时,我都会将节点的"symbol"字段设置为预购字符串中的以下字符。不过我无法让它工作。谁能帮忙?这是我的代码("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;
      }
   }
}

似乎在变化

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的东西)。要使whold事情起作用,除了上面的更改之外,更改

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内部的指针。