leetcode_95 不同的二叉搜索树 II

74 阅读1分钟

要求

给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。

image.png

示例 1:

输入:n = 3
输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]

示例 2:

输入:n = 1
输出:[[1]]

提示:

  • 1 <= n <= 8

核心代码

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
        
class Solution:
    def generateTrees(self, n: int) -> List[TreeNode]:
        if n == 0:
            return []
        def generate(start,end):
            trees = []
            for root in range(start,end):
                for left in generate(start,root):
                    for right in generate(root + 1,end):
                        node = TreeNode(root)
                        node.left = left
                        node.right = right
                        trees.append(node)
            return trees or [None]
        return generate(1,n+1)

image.png

解题思路:以每一个i都作一次根节点,i将数列分为两部分(1,i-1)(i+1, n)在前一个区间中让每个j都做一次根节点构成的树作为i的左子树,在后一个区间中让每个k都做一次根节点构成的树作为i的右子树,将所有的情况组合起来

来回只用到一个函数用来生成以i为根节点的树,递归调用即可,结束的条件就是没有节点可以生成,返回[None]