在C++中从预购中构建一棵树
Building a tree from preorder in C++
我正在做压缩/解压缩作业。我正在尝试编写一个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 = left
和n->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
内部的指针。
相关文章:
- 检查 2 棵树是否具有相同的顺序
- 我该如何平衡一棵退化的树?C++数据结构
- 从字符串构建二叉树
- 重建一棵树
- 如何从正常的BST继承一棵红黑树
- 我的构建二叉树解决方案有什么问题?
- 从森林里造一棵n元树
- Android Studio Cmake曾经为所有构建变体构建一次
- 二进制搜索树 - 将一棵树复制到另一棵树中
- C 复制一棵二进制树
- 找出两棵树是同构的
- 求一棵树的直径
- 构建二进制表达式树C++
- 根据代码表构建一个huffman树
- 在C++中从预购中构建一棵树
- 有效地在文件中构建一组唯一行,而无需在集中存储实际行
- 遍历一棵 n 元树
- 如何检查一棵树是否是另一棵树的子树
- 如何将一棵树划分为两个子树
- 在一棵有191个节点且高度为9的二叉树中找到一个键所需的最大比较次数是多少?