我有一個樹形數據結構:高效刪除樹數據結構
- 樹的根有沒有父母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