我正在尝试这个问题,但无法弄清楚算法 . 我的偏好是迭代地做 . 直到现在,我已经找到了一些东西,但在某些方面还不确定 .
目前,我的算法看起来像:
-
首先遍历树以查找节点
-
遍历树时,跟踪上一个节点 .
-
如果找到节点,检查是否存在左子节点,那么它是后继节点 .
-
如果留下的孩子不在场,那么检查是否有正确的孩子,即继承孩子 .
-
如果节点(留给父节点)并且之前已经保存了prev节点,则prev或prev的右子节点是后继节点 .
-
但是,如果我们找到的节点是父权的权利,并且没有左或右子,如何找到该节点的后继者呢?
可能是这个算法存在很多缺陷,因为我还没有正确理解所有情况 . 如果有人有任何想法或算法,请分享 .
提前致谢 .
2 回答
当你在预订中找到一个节点时,找到它的后继只是 travesing to its next node .
我首先想到的是一个节点与其后继者的 Value 观之间的关系,但我发现它似乎不太清楚,就像有序中的关系一样 . 我认为节点及其后继者(如果存在)只有一步:只需继续进行 . 所以我设计了这个算法 .
我的算法基于preorder travesal,它可以在二叉树上运行,而不仅仅是BST .
并使用它:
EDIT:
通过使用如下堆栈,将递归算法转换为迭代算法并不困难:
but according to your comment and original description, I think the one you want is iterative algorithm without a stack.here it is.
经过思考,搜索和尝试,我写了一篇 . 当在没有堆栈的情况下迭代地遍历树时,节点的父节点不再是无用的 . 在路径中,一些节点不仅访问一次,而且您需要在那时记录其方向 .
用法与第一次重复使用相同 .
如果您感到困惑,主要是关于节点的方向,您可以绘制树并在纸上绘制预订遍历的路径,这将有所帮助 .
我不确定代码中是否还有错误,但它在下面的树上运行良好:
顺便说一句,“通过递归和迭代对树的预订(或其他)travese算法”是一个常见的访谈问题,虽然允许通过堆栈解决后者 . 但我认为BST要求在前期是不必要的 . 订购travese .
我的算法实现不使用密钥 . 因此,可以在任何类型的二叉树中使用它,而不仅仅是在二叉搜索树中 . 我使用的算法是这样的:
如果给定节点不存在,则返回NULL
如果节点已离开子节点,则返回左子节点
如果节点有正确的孩子,则返回右孩子
返回最右边的祖先,其右孩子在场,但尚未处理
贝娄有我的解决方案 .