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

示例 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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/unique-binary-search-trees-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

感谢windliang大佬的详细解法,传送门详细通俗的思路分析,多解法

class Solution {public List<TreeNode> generateTrees(int n) {
//      return generateTreesI(n);return getTreeNodesII(n);}//方法二:每次新加的数字大于之前的所有数字,所以新增加的数字出现的位置只可能是根节点或根节点的右孩子,右孩子的右孩子等等//总之一定是在右边,其次,新数字所在位置原来的子树,改为当前插入数字的左孩子即可,因为插入数字是最大的。//由于求当前的所有解只需要上一次的解,所有我们只需要两个list,pre保存上一次的所有解,cur计算当前的所有解。private List<TreeNode> getTreeNodesII(int n) {List<TreeNode> pre = new ArrayList<>();if (n == 0) {return pre;}pre.add(null);for (int i = 1; i <= n; i++) {List<TreeNode> cur = new ArrayList<>();//遍历之前的所有解for (TreeNode root : pre) {//1.插入到根节点,并把之前的树作为新节点的左子树TreeNode insert = new TreeNode(i);insert.left = root;cur.add(insert);//2.插入到右孩子,右孩子的右孩子,右孩子的右孩子的右孩子等等for (int j = 0; j < i - 1; j++) {//复制当前的树TreeNode rootCopy = treeCopy(root);//找到要插入右孩子的位置TreeNode right = rootCopy;int k = 0;for (; k < j; k++) {if (right == null) {break;}right = right.right;}//如果本次循环后的right已经为空,提前结束if (right == null) {break;}//保存当前右孩子的子树作为插入节点的左孩子TreeNode rightTree = right.right;insert = new TreeNode(i);//右孩子是新插入的节点right.right = insert;//插入节点的左孩子是插入位置之前的子树insert.left = rightTree;//根节点加入到结果集中cur.add(rootCopy);}}pre = cur;}return pre;}private TreeNode treeCopy(TreeNode root) {if (root == null) {return null;}TreeNode rootCopy = new TreeNode(root.val);rootCopy.left = treeCopy(root.left);rootCopy.right = treeCopy(root.right);return rootCopy;}private List<TreeNode> generateTreesI(int n) {if (n == 0) {return new LinkedList<>();}return build(1, n);}//方法一:递归private List<TreeNode> build(int lo, int hi) {List<TreeNode> list = new LinkedList<>();if (lo > hi) {//将null加入结果中list.add(null);return list;}//1.穷举root所有可能性for (int i = lo; i <= hi; i++) {//2.递归构造出左右子树所有合法BSTList<TreeNode> leftList = build(lo, i - 1);List<TreeNode> rightList = build(i + 1, hi);//3.给root节点穷举所有左右子树的组合for (TreeNode left : leftList) {for (TreeNode right : rightList) {TreeNode root = new TreeNode(i);root.left = left;root.right = right;list.add(root);}}}return list;}
}

Leetcode刷题95. 不同的二叉搜索树 II相关推荐

  1. 刷题记录8---验证二叉搜索树+二叉树的层序遍历+从前序与中序遍历序列构造二叉树+二叉树展开为链表+二叉树的最近公共祖先

    前言 所有题目均来自力扣题库中的hot 100,之所以要记录在这里,只是方便后续复习 98.验证二叉搜索树 题目: 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树. 有效 二叉搜 ...

  2. 20200721:每日一题之不同的二叉搜索树 II(leetcode95)

    不同的二叉搜索树 II 题目 思路与算法 代码实现 复杂度分析 题目 思路与算法 很基本的思路就是递归,没太多其他想法,直接根据二叉搜索树的性质进行递归即可. 代码实现 class Solution ...

  3. LeetCode刷题复盘笔记—1373. 二叉搜索子树的最大键值和

    今日主要总结一下,1373. 二叉搜索子树的最大键值和 题目:1373. 二叉搜索子树的最大键值和 Leetcode题目地址 题目描述: 给你一棵以 root 为根的 二叉树 ,请你返回 任意 二叉搜 ...

  4. [Leetcode][第95题][JAVA][不同的二叉搜索树 II][递归]

    [问题描述][中等] [解答思路] 1. 递归 复杂度 class Solution {public List<TreeNode> generateTrees(int n) {if (n ...

  5. LeetCode 95. 不同的二叉搜索树 II(递归)

    1. 题目 给定一个整数 n,生成所有由 1 - n 为节点所组成的二叉搜索树. 示例: 输入: 3 输出: [[1,null,3,2],[3,2,null,1],[3,1,null,null,2], ...

  6. 95. 不同的二叉搜索树 II

    给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树. 示例: 输入: 3 输出: [   [1,null,3,2],   [3,2,null,1],   [3,1,null,nul ...

  7. leetcode算法题--有序链表转换二叉搜索树★

    原题链接:https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/ 1.二分法+递归 TreeNode* ...

  8. [leetcode] 95. 不同的二叉搜索树 II

    开始的想法是全排列数字1~n作为输入,然后构造BST,但是,不行,有重复. 下面代码是leetcode官方题解的C++版本 https://leetcode-cn.com/problems/uniqu ...

  9. Leetcode 95. 不同的二叉搜索树 II 解题思路及C++实现

    解题思路: 递归的思路. /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* ...

  10. LeetCode 96不同的二叉搜索树95不同的二叉搜索树Ⅱ

    微信搜一搜:bigsai 算法文章题解全部收录在github仓库bigsai-algorithm 关注回复进群即可加入力扣打卡群,欢迎划水.近期打卡: LeetCode 92反转链表Ⅱ&93复 ...

最新文章

  1. Angular 2 Pipe
  2. 致物理学家的一个实验
  3. CentOS下安装Telnet
  4. python多进程打印输出_python 多进程日志 logging
  5. 常用的sql server 函数、存储过程、临时表总结
  6. 基因行业容器存储解决方案
  7. 在ubuntu13.04上安装Mac主题
  8. linux麒麟安装教程,优麒麟使用教程第四期:Linux平台U盘启动盘制作
  9. 使用 tinypng 进行批量压缩
  10. xci转化nsp_XCI游戏格式转NSP格式工具4NXCI v4.01+简单教程
  11. 程序员个人修养和职业规划
  12. 阿里天池:小样本商标检测(baseline0.50)
  13. c语言中local status6,2016年12月英语六级听力真题及答案:第2套
  14. 编写一个Linux虚拟网卡来实现类NVI
  15. 什么是CVE?常见漏洞和暴露列表概述
  16. 传说Silverlight 3将提升4成浏览效能
  17. 如何打开被关闭的任务管理器
  18. 2022年03月05日:宜未雨而绸缪,毋临渴而掘井
  19. 主流云计算厂商产品服务介绍
  20. 大数据(线性/非线性)降维方法(PCA,LDA,MDS,ISOMAP,LLE)

热门文章

  1. 《天道》中最智慧的4句话,看懂改变一生
  2. 医院HIS预约系统源码丨同城排队预约下单微信小程序公众号 his源码
  3. 评估分形指数和HURST指数预测金融时间序列的能力
  4. 了解 Web 服务规范: 第 7 部分:Web 服务业务流程执行语言
  5. 个人认为比较有意思的文章
  6. python --离线识别图片中文字(easyocr)
  7. win10关机后cpu风扇还在转_电脑关机后CPU风扇还在转的原因和解决办法
  8. Python绘制二元函数图像
  9. git下载单个文件夹
  10. git如何选择性合并_git - 如何挑选一系列提交并合并到另一个分支?