【问题标题】:Generate all valid binary search trees given a list of values给定值列表生成所有有效的二叉搜索树
【发布时间】:2019-08-25 10:23:01
【问题描述】:

您好,我正在尝试解决有关 leetcode 的以下问题,[https://leetcode.com/problems/unique-binary-search-trees-ii/]

我知道我可以访问解决方案,但我尝试以我的方式解决问题,但我被卡住了,我想知道它是否可以按照我的方式解决。 代码如下:

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

def generateTrees(myrange, n, res = None):
    if res == None:
        res = []
    if myrange == []:
        res.append(None)
        return
    for root in myrange:
        res.append(root)
        generateTrees([i for i in range(root) if i in set(myrange)], n, res) #leftchild
        generateTrees([i for i in range(root+1, n) if i in set(myrange)], n, res) #rightchild
    return res

最初myrange 只是包含节点值的列表,nmyrange 的长度。

我这样做的方式是一种 DFS,我在节点上循环,使每个节点成为根一次,然后对左右子树执行相同操作以获取所有组合。但我面临的问题是我无法弄清楚如何管理res 以从其中删除元素作为我的递归回溯(并使其res 仅包含有效的bst,然后将它们放入其他一些列表中是我的实际结果)。

如果您认为我的方法是有效的还是坏的,我想要一些指针,甚至只是 cmets ..等等。

【问题讨论】:

  • 不确定树输出格式中的顺序是什么。这个问题并没有真正解释这种格式。还是输出TreeNode的实例的目的?您的代码从不实例化该类?
  • 你是对的,它不是我试图通过创建一个列表的列表来解决它,这些列表的格式与他们在 leetcode 上的示例相同,当时我本可以输出根节点列表...

标签: python-3.x recursion binary-search-tree


【解决方案1】:

问题:

  • 正如您所提到的,您的代码只创建了一个不断追加的列表。
  • 即使您解决了这个问题,列表也永远不会以 BFS 的顺序出现,这正是问题示例所暗示的。
  • 对于选定的根,您需要列出其可能的左子树与其可能的右子树的所有组合——如果您愿意,可以使用笛卡尔积。您的代码中缺少此逻辑。

我愿意:

  • 不将res 作为参数传递给递归函数。直接返回,让调用者处理。
  • 不要使用范围,因为这似乎只会使事情复杂化。 if i in set(myrange) 似乎是一种获得两个范围之间重叠的低效方法。相反,我会将范围的两个极端作为单独的参数传递。
  • 使用TreeNode 类实际创建树,然后处理生成所需的输出格式。
  • 要生成输出格式,您需要 BFS 遍历树,这可以作为 TreeNode 上的方法实现。

以下是我认为可行的方法:

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

    def breadth_first(self):
        lst = []
        todo = [self]
        while any(todo):
            node = todo.pop(0)
            lst.append(node.val if node else None)
            if node:
                todo.append(node.left)
                todo.append(node.right)
        return lst

def generateTrees(n):
    def recur(start, end): # end is not included
        if start >= end:
            return [None]
        trees = []
        for root in range(start, end):
            lefts = recur(start, root)
            rights = recur(root+1, end)
            # Cartesian product:
            for left in lefts:
                for right in rights:
                    # Start with a new tree, and append to result
                    tree = TreeNode(root)
                    tree.left = left
                    tree.right = right
                    trees.append(tree)
        return trees
    return recur(1, n+1)

# Create the trees as a list of TreeNode instances:
trees = generateTrees(3)
# Convert to a list of lists 
print([tree.breadth_first() for tree in trees])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    相关资源
    最近更新 更多