给定一个整数 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

提示:

0 <= n <= 8

递归

二叉搜索树关键的性质是根节点的值大于左子树所有节点的值,小于右子树所有节点的值,且左子树和右子树也同样为二叉搜索树。

因此在生成所有可行的二叉搜索树的时候,假设当前序列长度为 n,如果我们枚举根节点的值为 i,那么根据二叉搜索树的性质我们可以知道左子树的节点值的集合为 [1…i−1],右子树的节点值的集合为 [i+1…n]。

而左子树和右子树的生成相较于原问题是一个序列长度缩小的子问题,因此我们可以想到用递归的方法来解决这道题目。

我们定义 generateTrees(start, end) 函数表示当前值的集合为 [start,end],返回序列 [start,end] 生成的所有可行的二叉搜索树。

按照上文的思路,我们考虑枚举 [start,end] 中的值 i 为当前二叉搜索树的根,那么序列划分为了 [start,i−1] 和 [i+1,end] 两部分。

我们递归调用这两部分,即 generateTrees(start, i - 1) 和 generateTrees(i + 1, end),获得所有可行的左子树和可行的右子树,那么最后一步我们只要从可行左子树集合中选一棵,再从可行右子树集合中选一棵拼接到根节点上,并将生成的二叉搜索树放入答案数组即可。

递归的入口即为 generateTrees(1, n),出口为当 start>end 的时候,当前二叉搜索树为空,返回空节点即可。

Code

暴力递归

    def generateTrees(self, n: int) -> List[TreeNode]:def generateTree(start, end):if start > end:return [None, ]allTrees = []for i in range(start, end + 1):leftTrees = generateTree(start, i - 1)rightTrees = generateTree(i + 1, end)for j in leftTrees:for k in rightTrees:currentTree = TreeNode(i)currentTree.left = jcurrentTree.right = kallTrees.append(currentTree)return allTreesreturn generateTree(1, n) if n else []

记忆化递归

class Solution:def generateTrees(self, n: int) -> List[TreeNode]:memory = {}def generateTree(start, end):nonlocal memoryif (start, end) in memory:return memory[start, end]if start > end:return [None, ]allTrees = []for i in range(start, end + 1):leftTrees = generateTree(start, i - 1)rightTrees = generateTree(i + 1, end)for j in leftTrees:for k in rightTrees:currentTree = TreeNode(i)currentTree.left = jcurrentTree.right = kallTrees.append(currentTree)memory[start, end] = allTreesreturn allTreesreturn generateTree(1, n) if n else []

95. Unique Binary Search Trees II 不同的二叉搜索树 II相关推荐

  1. leetcode 95. Unique Binary Search Trees II | 96. Unique Binary Search Trees

    95. Unique Binary Search Trees II https://leetcode.com/problems/unique-binary-search-trees-ii/ 题解 题是 ...

  2. 【重点 递归构造二叉树】LeetCode 95. Unique Binary Search Trees II

    LeetCode 95. Unique Binary Search Trees II 本博客转载自:[1]https://segmentfault.com/a/1190000007443961 [2] ...

  3. 95. Unique Binary Search Trees II

    分成两边, left right排列组合加到root, lo==hi就返回当前值 1 class Solution { 2 public List<TreeNode> generateTr ...

  4. 平衡搜索树(Binary Search Tree BST)、索引二叉搜索树

    文章目录 二叉搜索树 索引二叉搜索树 测试代码 这里只给出代码实现. 更多的性质日后再补. 二叉搜索树 // // Created by SongyangJi on 2020/12/23. //#if ...

  5. 96. Unique Binary Search Trees(I 和 II)

    Given n, how many structurally unique BST's (binary search trees) that store values 1-n? For example ...

  6. Unique Binary Search Trees II -- LeetCode

    原题链接:  http://oj.leetcode.com/problems/unique-binary-search-trees-ii/   这道题是求解所有可行的二叉查找树,从 Unique Bi ...

  7. LeetCode 96. Unique Binary Search Trees

    96. Unique Binary Search Trees Given n, how many structurally unique BST's (binary search trees) tha ...

  8. Unique Binary Search Trees ll -深度优先遍历DFS

    题目:Unique Binary Search Trees ll English: Given an integer n, generate all structurally unique BST's ...

  9. 【卡塔兰数】LeetCode 96. Unique Binary Search Trees

    LeetCode 96. Unique Binary Search Trees 本博客转载自:http://www.cnblogs.com/grandyang/p/4299608.html Solut ...

最新文章

  1. 认清Hadoop和Spark的这几点区别,学习时才能事半功倍
  2. VALSE 2020来了!60位计算机视觉、模式识别领域的优秀青年学者齐聚一堂
  3. python装饰器-python中的装饰器常用于哪些应用场景
  4. 注意scrapy中SgmlLinkExtractor的默认deny_extensions
  5. QT的QShortcut类的使用
  6. Apache启动错误:could not bind to address[::]:443
  7. centos 账号安全设置
  8. c#二维数据最大最小值_C#| 打印类型,各种数据类型的最大值和最小值
  9. Flutter中为图片设置波纹点击效果
  10. 案例:控制文件序列号满故障处理和分析
  11. linux 软件包 rpm命令之安装、更新、卸载、依赖
  12. 最实用的清理IE命令 ClearMyTracksByProcess
  13. mysql 1114_mysql 解决 ERROR 1114 (HY000): The table 'XXX' is full
  14. 精益求精, ePub 电子书制作手记
  15. 百问网7天物联网智能家居 学习心得 打卡第七天
  16. [luogu]P1852跳跳棋
  17. 趣店罗敏:从寒门贵子到面临退市 再到抢占预制菜新风口
  18. 主机能ping通Ubuntu,Ubuntu无法ping通主机
  19. unity应用实例——从头撸一个全新的FPS游戏(5)
  20. CSS3之边框图片border-image

热门文章

  1. coredata 数据库升级
  2. (转)如何成为顶级生物信息学家?
  3. C# string类型和byte[]类型相互转换
  4. winform弹出唯一窗体的方法
  5. 【Alpha】第二次Scrum meeting
  6. JavaScript:prototype属性使用说明
  7. PHP中文简繁互转代码 完美支持大陆、香港、台湾及新加坡
  8. mysql 5.0存储过程学习总结
  9. oracle中的cursor属性有哪些,Cursor语法及理解
  10. 怎么才能让计算机发出音乐,我要怎样把电脑上的歌曲传到手机里去啊?-怎么能把电脑里面的歌...