Given n, generate all structurally unique BST's (binary search trees) that store values 1...n.

For example,

Given n = 3, your program should return all 5 unique BST's shown below.

  1. 1 3 3 2 1
  2. \ / / / \ \
  3. 3 2 1 1 3 2
  4. / / \ \
  5. 2 1 2 3

confused what "{1,#,2,3}" means? >
read more on how binary tree is serialized on OJ.

思路:这一题尽管比較繁琐。可是难度不算非常大,能够运用排列组合的思想,全排列,然后查找符合要求的二叉搜索树就可以。

也能够运用递归,将数分为左右子树,进而简化求解。

排列组合思想代码例如以下(不知为什么OJ未通过,n=2时报错。但本地測试全然正确):

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode(int x) { val = x; }
  8. * }
  9. */
  10. public class Solution {
  11. boolean[] b;
  12. List<TreeNode> list;
  13. Set<String> set = new HashSet<String>();
  14. public List<TreeNode> generateTrees(int n) {
  15. b = new boolean[n];
  16. int[] a = new int[n];
  17. list = new ArrayList<TreeNode>();
  18. for(int i = 0; i < n; i++){
  19. a[i] = i+1;
  20. }
  21. create(a,null,n);
  22. return list;
  23. }
  24.  
  25. /**
  26. * 生成二叉搜索树
  27. */
  28. private void create(int[] a,TreeNode root,int nn){
  29. if(nn == 0){
  30. TreeNode q = root;
  31. String s = preOrder(q, "");
  32. //System.out.println(s);
  33. if(set.add(s)){
  34. list.add(root);
  35. }
  36. return;
  37. }
  38.  
  39. for(int i = 0; i < a.length; i++){
  40. if(!b[i]){
  41. b[i] = true;
  42. TreeNode p = new TreeNode(a[i]);
  43. root = insert(root,p);
  44. create(a,root,nn-1);
  45. root = delete(root,p);
  46. b[i] = false;
  47. }
  48. }
  49. }
  50.  
  51. /**
  52. * 前序遍历
  53. * @param root
  54. * @param s
  55. * @return
  56. */
  57. private String preOrder(TreeNode root,String s){
  58. if(root != null){
  59. s += root.val;
  60.  
  61. if(root.left != null){
  62. s = preOrder(root.left, s);
  63. }
  64.  
  65. if(root.right != null){
  66. s = preOrder(root.right, s);
  67. }
  68. }
  69. return s;
  70. }
  71.  
  72. /**
  73. * 删除节点
  74. * @param root
  75. * @param p
  76. * @return
  77. */
  78. private TreeNode delete(TreeNode root, TreeNode p) {
  79. if(root.val == p.val)
  80. return null;
  81. if(root.val < p.val){
  82. root.right = delete(root.right,p);
  83. }else{
  84. root.left = delete(root.left,p);
  85. }
  86. return root;
  87. }
  88.  
  89. /**
  90. * 将新节点插入二叉搜索树
  91. */
  92. private TreeNode insert(TreeNode root,TreeNode node){
  93. TreeNode p = root;
  94.  
  95. if(p == null){
  96. p = node;
  97. return p;
  98. }
  99. if(node.val < p.val){
  100. root.left = insert(p.left,node);
  101. }else{
  102. root.right = insert(p.right,node);
  103. }
  104. return root;
  105. }
  106. }

递归解法:

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode(int x) { val = x; }
  8. * }
  9. */
  10. public class Solution {
  11. public List<TreeNode> generateTrees(int n){
  12. List<TreeNode> list = new ArrayList<TreeNode>();
  13. if(n <= 0){
  14. list.add(null);
  15. return list;
  16. }
  17. list = createTree(1,n);
  18.  
  19. return list;
  20. }
  21. /**
  22. * 循环生产二叉搜索树
  23. * @param i 開始值
  24. * @param j 结束值
  25. * @return
  26. */
  27. private List<TreeNode> createTree(int i, int j){
  28.  
  29. List<TreeNode> list = new ArrayList<TreeNode>();
  30. //起始大于结束值,加入null
  31. if(i > j){
  32. list.add(null);
  33. return list;
  34. }
  35. //相等也即加入一个
  36. if(i == j){
  37. list.add(new TreeNode(i));
  38. return list;
  39. }
  40. //循环加入
  41. for(int k = i; k <= j; k++){
  42. //左子树肯定比i小
  43. List<TreeNode> left = createTree(i,k-1);
  44. //右子树肯定比i大
  45. List<TreeNode> right = createTree(k+1,j);
  46. //将结果循环加入
  47. for(TreeNode l:left){
  48. for(TreeNode r:right){
  49. TreeNode root = new TreeNode(k);
  50. root.left = l;
  51. root.right = r;
  52. list.add(root);
  53. }
  54. }
  55. }
  56. return list;
  57. }
  58. }

leetCode 95.Unique Binary Search Trees II (唯一二叉搜索树) 解题思路和方法的更多相关文章

  1. [LeetCode] 95. Unique Binary Search Trees II 唯一二叉搜索树 II

    Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...

  2. [LeetCode] 95. Unique Binary Search Trees II 独一无二的二叉搜索树之二

    Given an integer n, generate all structurally unique BST's (binary search trees) that store values 1 ...

  3. [Leetcode] Unique binary search trees ii 唯一二叉搜索树

    Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...

  4. [LeetCode] Unique Binary Search Trees II 独一无二的二叉搜索树之二

    Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...

  5. LeetCode OJ:Unique Binary Search Trees(唯一二叉搜索树)

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

  6. 【LeetCode-面试算法经典-Java实现】【096-Unique Binary Search Trees(唯一二叉搜索树)】

    [096-Unique Binary Search Trees(唯一二叉搜索树)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given n, how many s ...

  7. [LeetCode] 95. Unique Binary Search Trees II(给定一个数字n,返回所有二叉搜索树) ☆☆☆

    Unique Binary Search Trees II leetcode java [LeetCode]Unique Binary Search Trees II 异构二叉查找树II Unique ...

  8. [leetcode]95. Unique Binary Search Trees II给定节点形成不同BST的集合

    Given an integer n, generate all structurally unique BST's (binary search trees) that store values 1 ...

  9. leetcode 95 Unique Binary Search Trees II ----- java

    Given an integer n, generate all structurally unique BST's (binary search trees) that store values 1 ...

随机推荐

  1. 部署私有Docker Registry

    安装部署一个私有的Docker Registry是引入.学习和使用Docker这门技术的必经之路之一.尤其是当Docker被所在组织接受,更多人.项目和产品开始接触和使用Docker时,存储和分发自制 ...

  2. 【CF1016C】Vasya And The Mushrooms(模拟)

    题意:给定一个2*n的矩阵,每一个点有一个权值,从左上角出发,时间t=0开始,连续的走,将矩阵走完, 每走一步,t++,并且得到t*当前格子的权值的值,求最大的权值和 n<=3e5,1<= ...

  3. AtCoder Regular Contest 090 F - Number of Digits

    题目链接 Description For a positive integer \(n\), let us define \(f(n)\) as the number of digits in bas ...

  4. hdu 3549 Flow Problem 最大流 Dinic

    题目链接 题意 裸的最大流. 学习参考 http://www.cnblogs.com/SYCstudio/p/7260613.html Code #include <bits/stdc++.h& ...

  5. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---20

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  6. 【linux高级程序设计】(第七章)终端及串口编程 未完成

    一.端口设备类型 1.显示设备基本信息 cat /proc/tty/drivers 里面包括了: 当前终端:/dev/tty 前台控制台终端:/dev/console 用于创建虚拟终端的:/dev/p ...

  7. interview ms1 robert move **

    move 2turn rightmove 3turn rightmove 6 初始位置为(0,0),方向为north,求最后的位置. string2char:  const char* t = sec ...

  8. LeetCode OJ-- Jump Game

    https://oj.leetcode.com/problems/jump-game/ 从0开始,根据每一位上存的数值往前跳. 这道题给想复杂了... 记录当前位置 pos,记录可以调到的最远达位置为 ...

  9. 用Gson解析没有数据头的纯数组json字符串

    无数据头Json字符串 Json字符串只有数组,而次数组没有名字,如下 [ { "name": "zhangsan", "age": &qu ...

  10. TopCoder SRM 682 Div1 Problem 450 SuccessfulMerger (环套树 + 分类讨论)

    题意  给定一个$n$个点$n$条边的无向图,现在要把这个图进行若干次操作,并选择一个点作为首都. 要求除首都外的任意两个点$u$, $v$,从$u$走到$v$必须经过这个首都. 操作为合并两个相邻的 ...