【问题标题】:Allocate a node pointers in a tree in C++在 C++ 中的树中分配节点指针
【发布时间】:2013-12-10 23:08:37
【问题描述】:

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

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

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

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 = new SplitNode(left_parameter)。您现在所拥有的是将临时复制到取消引用的 nullptr 中。

标签: c++ variables tree


【解决方案1】:

您不想像在此处那样将n->left 分配给局部变量。我假设您此时尚未在 findBestSplit 中为这些拆分节点分配任何内存。

相反,您必须通过说n->left = new SplitNode(left_parameter) 来管理内存,然后稍后通过相应的delete 调用来清理分配的内存。 n->right 也是如此。

您最终可能会得到一个带有根节点的deleteTree 函数。该根节点将在其子节点上递归调用deleteTree,直到它到达叶节点。在叶节点处,该节点将删除自身然后返回。这样你就不会忘记所有的树叶,并且可以适当地释放所有的内存。

【讨论】:

  • 太棒了,这正是我所需要的。谢谢
猜你喜欢
  • 2015-07-18
  • 2017-06-23
  • 1970-01-01
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多