高效删除树形数据结构

我有一个树形数据结构:

  • 树的根没有父母和以前的兄弟姐妹(它可以有下一个兄弟姐妹)。
  • 每个节点都有唯一的父节点。
  • 每个节点都有一个指向它的下一个和前一个兄弟,孩子和父母的指针。
  • 此树数据结构正在填充数百万个节点。 当我删除一个具有大量节点的树时,会引发堆栈溢出异常。 当节点数量相对较少或建立在发布模式时,数据结构运行良好。

    这是一个节点的析构函数:

        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;
                }
            }
        }
    

    可以实现一个非递归算法来遍历树并删除它的所有节点。

    你能建议一个有效的后序遍历算法来删除一个非二叉树吗?


    编辑:错过了有关向父节点返回指针的位。 这意味着我们不需要维护路径历史来回溯,我们可以取消堆栈。

    node = root;
    while (node)
    {
        if (node->firstChild)
        {
            next = node->firstChild;
            node->firstChild = null;
        }
        else 
        {
            next = node->nextSibling ? node->nextSibling : node->parent;
            delete node;
        }
        node = next;
    }
    

    原始答案:

    任何你可以递归地做的事情,你可以做一个循环和一个堆栈。 虽然这不需要更少的内存,但优点是可以将该内存放在堆上并避免溢出。

    s.push(root);
    while (!s.empty())
    {
         node = s.pop();
         if (node->nextSibling) s.push(node->nextSibling);
         if (node->firstChild) s.push(node->firstChild);
         delete node;
    }
    

    我会尝试一些更简单的方法,让递归析构函数完成它们的任务:

    Entity::~Entity(void)
    {
        Entity* child = firstChild;
        while (child) {
          Entity *succ = child->getNextSibling();
          delete child;
          child = succ;
        }
    }
    

    以下是非递归解决方案的草图:

  • 使用根指针初始化指向节点的指针;
  • 重复
  • 如果当前节点有一个儿子,则转到该儿子;
  • 否则,删除当前节点并返回其父节点(如果有的话);
  • 直到当前节点没有父节点。
  • 链接地址: http://www.djcxy.com/p/30465.html

    上一篇: Efficient delete of a tree data structure

    下一篇: Select rows from table using tree order