用C++在树中分配节点指针

Allocate a node pointers in a tree in C++

本文关键字:分配 节点 指针 C++      更新时间:2023-10-16

这个问题可以总结为:如何正确处理递归函数中的指针初始化?

我想这个问题很简单,但我仍然不知道如何解决

我有一个树结构定义如下:

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,直到到达叶节点为止。在叶节点上,该节点将删除自己,然后返回。这样你就不会失去对所有树叶的追踪,并且你可以适当地释放所有的内存。