非递归析构函数二进制搜索树使用堆栈

时间:2013-04-27 08:39:52

标签: c++ search stack binary-tree binary-search-tree

我正在考虑使用一堆二进制节点指针创建一个非递归析构函数。这段代码会运行吗?

binaryNode* parent = root;
while (!empty())
{
  if (parent->left)
  {
    stack1.push(parent)
    parent = parent->left;
  }
  else if (parent->right)
  {
    stack1.push(parent)
    parent = parent->right;
  } else 
  {
    delete parent;
    parent = stack1.pop();
  }
}

我还没有完成基本程序,所以上面的代码还没有经过测试。我觉得它应该没有错。虽然它没有经过测试运行,但我追踪了一个二叉搜索树,它确实很好。另外,我无法在stackoverflow中找到具有二进制搜索树遍历的堆栈实现。

1 个答案:

答案 0 :(得分:0)

对我来说,看起来你的代码中存在很多问题,但是当你实现代码时很难确定你的意图是什么(即哪些问题是C ++的问题,哪些是问题用“设计级”伪代码)。代码中的一个问题是delete parent仅释放parent引用的对象占用的空间。因此,当您弹出堆栈时,您可能最终会重新执行if (parent->left)分支,从而再次delete同一个对象。而你似乎只有delete叶子节点。

我遇到的最大问题是你的算法设计不清楚。获得递归算法的基于堆栈的版本的通常方法是首先获得递归版本(至少在纸上),然后分解递归。在这种情况下,您的标准post-order traversal(通过调用do_action实施,下面是node = root,与

一致。
do_action(node)
    if node has left descendant
        do_action(left descendant)
    if node has right descendant
        do_action(right descendant)
    perform action on node

在您的情况下,action将删除该节点。现在,您可以在没有显式递归的情况下实现它(并且如Non recursive Depth first search algorithm的答案所示,对于某些树遍历问题,这可能非常简单)。然而,在这种情况下你可能会想要为什么这么说?递归调用使用程序自己的堆栈,而您希望使用自己的数据结构隐式递归。只有在删除tail end recursion的情况下,优势才是黑色和白色,因为这里的递归确实被消除了,而不是用堆栈模拟。

如果您沿着删除递归的路线前进,看起来您的代码可能会非常难看:请参阅http://leetcode.com/2010/10/binary-tree-post-order-traversal.htmlNon-recursive post order traversal。你的隐式递归代码在时间和/或空间上的表现可能比你原来的显式递归代码差。肯定会有更多的错误!