2

我在递归函数中使用后序遍历来解除分配二叉树节点时遇到问题。

这是我的结构的一部分。我的树解构器将从根开始释放

struct Node {
    Base * data;
    Node * left, * right, *parent;
    static long occupancy;
    long balance;
    long height;

    Node (Base * element) : data (element), left (0), right (0),
        parent (0), balance (0), height(0) {

         occupancy++;
    }


    ~Node (void) {

        deleteNodes();

    }

    void deleteNodes (void) {

        if(height == 0)
            return;

        if(left)
            left->deleteNodes();
        if(right)
            right->deleteNodes();

        if(left)
            delete left;
        if(right)
            delete right;

        delete data;


    }
}
4

2 回答 2

3

您不需要递归地删除节点(如果您这样做可能会导致问题,因为您会尝试多次删除指针) - 如果您删除子节点,析构函数将自动(递归地)被调用。

~Node (void) {
   if (left)
      delete left;
   if (right)
      delete right;
   delete data;
}
于 2013-11-10T16:49:27.420 回答
1

对于递归遍历,您始终将树的根作为参数传递。

void deleteNodes(Node *rover) {
    //**check if rover is nullptr
    deleteNodes(rover->left);
    deleteNodes(rover->right);
    //... 
}

**您不需要检查 rover->left 和 rover->right 是否为 nullptr,因为您在函数的开头检查它。

希望能帮助到你。

于 2013-11-10T16:28:06.867 回答