我有一个树形数据结构:高效删除树数据结构
- 树的根有没有父母ANS以前没有兄弟姐妹(它可以 旁边的兄弟姐妹)。
- 每个节点都有唯一的父节点。
- 每个节点都有一个指向它的下一个和上一个兄弟,孩子和父母的指针。
此树数据结构正在填充数百万个节点。当我删除一棵树有 大量的节点时,会引发堆栈溢出异常。当节点数量相对较少或建立在发布模式时,数据结构运行良好。
这是一个节点的析构函数:
Entity::~Entity(void)
{
Entity* child = NULL;
if (firstChild != NULL)
child = firstChild->getNextSibling();
while(child != NULL)
{
delete child->getPreviousSibling();
child->setPreviousSibling(NULL);
child = child->getNextSibling();
}
if (lastChild != NULL)
delete lastChild;
if (isRoot())
{
if (nextSibling != NULL)
{
nextSibling->setPreviousSibling(NULL);
delete nextSibling;
}
}
}
一个可以实现非递归算法遍历树并删除所有它的节点。
你能否建议一个高效的后序遍历算法来删除一个非二叉树?
另一种方法(使用额外内存)是通过节点存储对数组或专用链接列表中的所有树节点的引用,并根据该节点而不是树结构进行删除。 – 2012-02-13 18:50:17
您应该保留原始代码,否则问题无法理解。您现在公开的代码(未接受我的答案),**不会引发任何堆栈溢出,正如您已经测试的那样。 – CapelliC 2012-02-14 11:25:41
不幸的是,原始代码和代码会引发堆栈溢出。但你的代码更清晰... – 2012-02-14 12:50:16