我正在考虑使用一堆二进制节点指针创建一个非递归析构函数。这段代码会运行吗?
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中找到具有二进制搜索树遍历的堆栈实现。
答案 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.html和Non-recursive post order traversal。你的隐式递归代码在时间和/或空间上的表现可能比你原来的显式递归代码差。肯定会有更多的错误!