【发布时间】:2021-05-30 15:39:04
【问题描述】:
当销毁时(当对象超出范围时)General Tree 是否有必要像使用双向链表一样遍历每个节点并删除它们?我正在编写的通用树是一个循环,因此可以在恒定时间内完成插入。如果有人可以帮助我修复错误,那将非常有帮助。下面的析构函数当前导致堆栈溢出(我认为是因为树是循环的)。
这里有两个析构函数
~Node()
{
if(left){delete left;}
if(next){delete next;}
if(parent){delete parent;}
}
通用树
~Gen()
{
if (head)
delete head; //call destructor on node
head = nullptr;
m_size = 0;
}
这是节点类
class Node {
public:
typedef Node* nodePtr;
int data;
//Left child- right sibling implementation
nodePtr left, next, parent;
int rank; //will be used for merging.
~Node()
{
if(left){delete left;}
if(next){delete next;}
if(parent){delete parent;}
}
private:
Node & operator =(const Node&);
};
这是使用上面节点的树
class Gen{
public:
typedef Node* nodePtr;
Gen():m_size(0),head(0){}
~Gen()
{
if (head)
delete head; //call destructor on node
head = nullptr;
m_size = 0;
}
void push(int val)
{
nodePtr newNode = new Node;
newNode->data = val;
newNode->rank = 0;
newNode->left = newNode->next = newNode->parent = 0; //set all pointers to null
insertRoot(newNode); //call the inserthelper
++m_size;
}
//other functions (deleteMin, decreaseKey etc)
private:
int m_size;
nodePtr head;
nodePtr insertRoot(nodePtr newNode)
{
//create a circular link
if (!head)
{
head = newNode;
newNode->next = newNode;
}
else
{
newNode->next = head->next;
head->next = newNode;
if (newNode->data < head->data) //min heap (lazy insert)
head = newNode;
}
}
};
【问题讨论】:
-
if(parent){delete parent;}你可能不想要那个;它导致双重破坏。父母拥有其孩子并负责删除它们,而不是相反。 -
因为这是构建的,所以没有 O(1) 机制来删除整个树。它需要像组装一样被抹去;一砖一瓦。
-
是的,
node->next链接形成一个循环列表这一事实也会导致双重破坏,一旦你绕了一圈回到已经被破坏的节点。您可能希望以迭代方式而不是递归方式实现销毁。
标签: c++ tree destructor