day-88

95.不同的二叉搜索树 II

https://leetcode-cn.com/problems/unique-binary-search-trees-ii/

思路

先从 [1, n] 中选出一个数字 i 作为根元素,然后用剩下的数字去分别构建左右子树:

  • [1, i - 1] 的数字用于构建左子树

  • [i + 1, n] 的数字用于构建右子树

可以看出构建左右子树其实就是原题的子问题,只是规模减小了,我们可以再对子问题分别进行拆分,直到不能再拆,也就是没有数字了,这时候直接返回 null 即可。

假设我们已经实现了函数 generateTreesgenerateTrees([1, n]) 会返回 N 棵二叉搜索树,那么当我们选定一个数字 i 作为根节点时,问题可以拆分成:

  • generateTrees([1, i - 1]) ,返回 L 棵左子树,

  • generateTrees([i + 1, n]) ,返回 R 棵右子树,

那原问题的答案也很容易得出,就是将所有左子树和右子树进行排列组合,最终得到 I 棵二叉搜索树。

但 [1, n] 中任意一个数字都可以作为根节点,所以还要加一层循环。

复杂度

  • 时间复杂度:

  • 空间复杂度:

代码

JavaScript Code

96.不同的二叉搜索树

https://leetcode-cn.com/problems/unique-binary-search-trees/

思路

大概思路和 95 题差不多,不过要用记忆化递归才不会超时。

代码

Python Code

Originally posted by @suukii in https://github.com/leetcode-pp/91alg-1/issues/115#issuecomment-682328630

Last updated

Was this helpful?