【问题标题】:How do I easily convert an iterative solution to a recursive solution?如何轻松地将迭代解决方案转换为递归解决方案?
【发布时间】:2019-06-26 15:48:27
【问题描述】:

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

树:

会变成

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

下面是我的代码:

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

我喜欢反复解决这类问题,因为它非常直观。但在大多数情况下,我也会被要求实施递归解决方案。我知道数据结构堆栈类似于递归函数的行为方式,但我仍然难以将迭代函数转换为递归函数。有什么建议吗?

【问题讨论】:

  • 与您的问题无关:我不喜欢您的解决方案的一件事是它将您的广度优先搜索代码与您的链接列表代码合并。如果你想使用广度优先搜索来创建一个数组怎么办?或者您想创建一个链表,但使用深度优先搜索?您没有很好地将问题的这两个原本不相关的方面模块化

标签: python recursion stack


【解决方案1】:

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

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

现在您需要一种方法来组合结果。您可以:

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

哪个更有意义取决于应用程序,但任何一个都有效。

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

【讨论】:

  • 为了记录,一个更可能的“基本情况”可能是你什么都不做来处理的缺失树(None,在 python 中)。那么“递归”的情况就不必担心哪些孩子在场/不在场。
猜你喜欢
  • 2020-06-07
  • 1970-01-01
  • 2016-02-15
  • 1970-01-01
  • 2013-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多