Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 递归后序遍历解除分配二叉树节点_C++_Algorithm_Recursion_Tree_Binary Tree - Fatal编程技术网

C++ 递归后序遍历解除分配二叉树节点

C++ 递归后序遍历解除分配二叉树节点,c++,algorithm,recursion,tree,binary-tree,C++,Algorithm,Recursion,Tree,Binary Tree,我在递归函数中使用后序遍历来释放二叉树节点时遇到问题 这是我结构的一部分。。我的树解构器将从根开始解除分配 struct Node { Base * data; Node * left, * right, *parent; static long occupancy; long balance; long height; Node (Base * element) : data (element), left (0), right (0),

我在递归函数中使用后序遍历来释放二叉树节点时遇到问题

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

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;


    }
}

对于递归遍历,总是将树的根作为参数传入

void deleteNodes(Node *rover) {
    //**check if rover is nullptr
    deleteNodes(rover->left);
    deleteNodes(rover->right);
    //... 
}
**您不需要检查rover->left和rover->right是否为null ptr,因为您在函数的开头进行了检查


希望能有帮助

对于递归遍历,总是将树的根作为参数传入

void deleteNodes(Node *rover) {
    //**check if rover is nullptr
    deleteNodes(rover->left);
    deleteNodes(rover->right);
    //... 
}
**您不需要检查rover->left和rover->right是否为null ptr,因为您在函数的开头进行了检查


希望能有帮助

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

~Node (void) {
   if (left)
      delete left;
   if (right)
      delete right;
   delete data;
}

您不需要递归地删除节点(如果您多次尝试删除指针,那么很可能会导致问题)——如果您删除子节点,析构函数将自动(递归地)被调用

~Node (void) {
   if (left)
      delete left;
   if (right)
      delete right;
   delete data;
}

那么,你的问题是什么?我不能让它正确地释放节点。我想知道我的deleteNodes功能有什么问题?如何删除节点本身?@user2378481通过删除节点本身。你的答案就在你的问题里<编码>删除p其中
p
指向要删除的树的根节点。看看杜克林的答案。那么你的问题是什么?我无法让它正确地释放节点。我想知道我的deleteNodes功能有什么问题?如何删除节点本身?@user2378481通过删除节点本身。你的答案就在你的问题里<编码>删除p其中
p
指向要删除的树的根节点。请参阅Dukeling的答案。+1这是正确的解决方案,同时需要注意的是:这可能(也将)导致具有数千个节点(或更多节点)的严重失衡树的不良后果。同样的问题,表面与一个完整的定期遍历(inoorder,preorder,等等)也出现在这里;由于溢出而导致调用堆栈故障的可能性。因此要小心。+1这是正确的解决方案,并注意:这可能(也将)导致具有数千个节点(或更多)的可怕的不平衡树的不良后果。同样的问题,表面与一个完整的定期遍历(inoorder,preorder,等等)也出现在这里;由于溢出而导致调用堆栈故障的可能性。所以要小心。