【问题标题】:Recrusive Destructor for Binary Tree?二叉树的递归析构函数?
【发布时间】:2014-10-11 11:21:47
【问题描述】:

如何递归地为二叉树实现析构函数?

一个节点有一个元素、一个指向左节点的指针和一个指向右节点的指针。 还有,什么时候设置左右节点指针为NULL?

【问题讨论】:

  • 简短的回答是,我不会。但是,如果您必须这样做,下面的所有答案都会这样做(至少在此评论发布时间)。选择一个符合您的树形布局的。

标签: c++ function recursion


【解决方案1】:

析构函数会自动递归到成员中。您几乎不必手动编写析构函数。

template<class T>
struct Node
{
    T data;
    std::unique_ptr<Node<T>> left, right;
};

template<class T>
struct BinaryTree
{
    std::unique_ptr<Node<T>> root;
};

【讨论】:

  • ...除非树非常高,否则递归析构函数调用可能会导致堆栈溢出。为避免这种情况,您需要编写一个非递归遍历树的析构函数。
  • 智能指针实际上会自动递归,如果每个引用计数下降,但该属性不一定是可取的(有或没有智能 ptrs),特别是对于大型容器,尤其是对于大型 。除非正确完成(即强制避免递归),否则顺序递归到智能指针销毁的 100,000 个元素链将彻底炸毁激活堆栈。
  • 这个问题专门要求使用递归析构函数,而这个答案中的实现是实现这一目标的最简单方法。
  • @WhozCraig 如果二叉树是平衡的,如果使用整个虚拟 RAM(内存为 64 位,则为 2),它的可管理深度为 most 128重新跟随长叉(例如,如果所有红色节点都存在))。但是,我同意依赖隐式递归析构函数对链表不利。
  • @Wyzard 哦,我勾选了答案。它实际上非常准确并且促进了智能指针的使用,这几乎总是一件可靠的事情。我评论了一个普遍的想法,即首先递归不一定是一个严格的想法。您的评估和想法是正确的,我可能应该在一般情况下发布该评论,而不是在这里做出回应。答案肯定适用,并且值得升级(到目前为止,所有其他人都是如此)。
【解决方案2】:

记住 o11c 的回答,如果您选择不使用智能指针并且需要为裸指针指向的节点实现析构函数,请使用后序遍历。

http://en.wikipedia.org/wiki/Tree_traversal#Post-order

【讨论】:

    【解决方案3】:

    如何递归地为二叉树实现析构函数?

    像这样:

    ~BinaryTreeNode()
    {
        delete _left;
        delete _right;
    }
    

    另外,什么时候将左右节点指针设置为NULL?

    从不在析构函数中。您可以在节点删除方法中做一个或另一个,或者两者都做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-09
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 2019-09-09
      • 2016-07-24
      • 1970-01-01
      相关资源
      最近更新 更多