- 难度: 中等
- 通过率: 34.2%
- 题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目描述
给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树。
示例:
输入: 3 输出: [[1,null,3,2],[3,2,null,1],[3,1,null,null,2],[2,1,3],[1,null,2,null,3] ] 解释: 以上的输出对应以下 5 种不同结构的二叉搜索树:1 3 3 2 1\ / / / \ \3 2 1 1 3 2/ / \ \2 1 2 3
解法:
把序列从某个位置切分,切分点为根节点,左右两边的分别用来构造左右子树。因为左右子树的可能性会很多。构造的左右子树是两个列表。用根节点组合不同的左右子树,即可得到答案。
import itertoolsclass Solution:def generateTrees(self, n: int) -> List[TreeNode]:if n == 0:return []return self._generate_trees(1, n)def _generate_trees(self, lo, hi):trees = []if lo > hi:trees.append(None)for i in range(lo, hi+1):left_trees = self._generate_trees(lo, i-1)right_trees = self._generate_trees(i+1, hi)for left, right in itertools.product(left_trees, right_trees):node = TreeNode(i)node.left = leftnode.right = righttrees.append(node)return trees