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,等等)也出现在这里;由于溢出而导致调用堆栈故障的可能性。所以要小心。