如何轻松地将迭代解决方案转换为递归解决方案?

时间:2019-02-02 05:01:42

标签: python recursion stack

我正在练习将BST转换为双链表的采访问题。

树:

enter image description here

将成为

enter image description here

我使用的方法是使用堆栈并按顺序遍历树时进行一些指针操作。

下面是我的代码:

def treeToDoublyList(self, root):
    """
    :type root: Node
    :rtype: Node
    """

    if not root:
        return

    dummy = Node(-1, None, None)
    prev = dummy
    stack = []
    n = root
    while stack or n:
        while n:
            stack.append(n)
            n = n.left
        n = stack.pop()
        n.left = prev
        prev.right = n
        prev = n
        n = n.right
    dummy.right.left = prev
    prev.right = dummy.right
    return dummy.right

我喜欢迭代式地解决此类问题,因为它非常直观。但是在大多数情况下,我还将被要求实施一个递归解决方案。我知道数据结构堆栈类似于递归函数的行为,但是在将迭代函数转换为递归函数时仍然遇到困难。有提示吗?

1 个答案:

答案 0 :(得分:1)

几乎每个递归函数都可以围绕“基本情况”和“递归情况”进行设计。

  • 基本情况可能是单个节点,没有子节点:这将产生一个琐碎的双向链接的一个元素列表。
  • 在递归情况下,您需要为左子节点(如果有),当前节点,最后是右子节点建立列表。

现在,您需要一种合并结果的方法。您可以:

  • 将(初始为空)列表传递到函数中,每个操作均按顺序附加到该列表中,或者
  • 构造子列表,然后在递归的情况下将它们拼接在一起。

哪个更有意义取决于应用程序,但是其中一个有效。

您可能需要考虑不同方法之间的权衡;如果我在采访你,我会问他们。

相关问题