用C++在树中分配节点指针
Allocate a node pointers in a tree in C++
这个问题可以总结为:如何正确处理递归函数中的指针初始化?
我想这个问题很简单,但我仍然不知道如何解决
我有一个树结构定义如下:
class SplitNode{
public:
Data d;
SplitNodeParam snp;
SplitNode* left_; //will stay uninitialized
SplitNode* right_;}
我用以下递归函数从其根构建了一个树:
void buildTree(SplitNode* n){
findBestSplit(n);
buildTree(n->left);
buildTree(n->right); //forget that the tree growing doesnt stop
}
我取一个节点及其数据,并根据函数对数据进行拆分。我想将当前节点的左子节点和右子节点分配如下。
void findBestSplit(SplitNode* n){
//Do stuff with data and parameters
SplitNodeParam left_parameter(/*Some parameters*/);
*(n->left)=SplitNode(left_parameter);
SplitNodeParam right_parameter(/*Some parameters*/);
*(n->right)=SplitNode(right_parameter);
}
最大的问题似乎是,我想给一个局部变量分配一个空指针SplitNode,并希望稍后能把它取回来,这几乎是不可能的。
我在C中看到了一些类似的例子(使用malloc),但我想知道在C++中如何巧妙地做到这一点
提前谢谢。
您不想像在这里那样将n->left
分配给局部变量。我假设您在findBestSplit
中的这一点上还没有为这些拆分节点分配任何内存。
相反,您必须通过说n->left = new SplitNode(left_parameter)
来管理内存,然后稍后使用相应的delete
调用来清理分配的内存。n->right
也是如此。
您最终可能会得到一个deleteTree
函数,该函数使用一个根节点。该根节点将在其子节点上递归调用deleteTree
,直到到达叶节点为止。在叶节点上,该节点将删除自己,然后返回。这样你就不会失去对所有树叶的追踪,并且你可以适当地释放所有的内存。
相关文章:
- 预分配的节点向量中的无锁树节点分配
- 如何在 C++11 的内存池中分配 std::map 的内部RB_tree节点?
- nullptr = 节点分配不正确
- C++错误(从不兼容的类型"void"分配给树节点*)
- 根节点应具有分配的节点,但仍为 NULL。为什么我无法将节点分配给根?
- 将节点添加到链接列表中,而无需明确分配内存空间(无需使用新)
- 是否可以将新的列表节点分配给链表的现有节点
- 在声明节点创建链接列表时,为什么静态内存分配不起作用
- 将指针分配给链接列表节点会引发"Segmentation Fault"
- 如何从链表上的节点为分配的类释放内存
- 如何在速推中为节点分配标签
- 用C++在树中分配节点指针
- 关于在omnetpp.ini中将两个不同的应用程序随机分配到50个节点
- 递归后序遍历解除分配二叉树节点
- 分段 C++中链表节点分配的错误
- C++分配节点指针
- 我们需要为链表节点分配内存吗
- BinaryTree不会分配新创建的节点
- List Traversal w/temp指针-在声明指针时分配指针引用的节点空间有危险
- std::list如何分配节点和元素