题目大意

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

解题思路

  • 递归方式
  • 为每一个[min,max] 区间的跟节点创建一个root

    具体的执行流程如下

终止条件 min> max 时 直接 返回rst
for 循环对每一个跟节点构建一个bst tree [min,max]
左子树 ,右子树 递归
1.如果 左右子树 都为0 时 直接返回单节点的一个bst
2.如果左子树为0右子树不为0时,为当前的每一个右子树构建一个root,他的指针指向当前的右子树
3.如果右子树为0,左子树不为0时,为当前的每一个左子树构建一个root,他的指针指向 当前的左子树
4.如果都不为0 时,以当前节点构建一个root,遍历左右子树,指向有效的左右子树
5.返回rst

  1. //给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。
  2. //
  3. //
  4. //
  5. //
  6. //
  7. // 示例 1:
  8. //
  9. //
  10. //输入:n = 3
  11. //输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]
  12. //
  13. //
  14. // 示例 2:
  15. //
  16. //
  17. //输入:n = 1
  18. //输出:[[1]]
  19. //
  20. //
  21. //
  22. //
  23. // 提示:
  24. //
  25. //
  26. // 1 <= n <= 8
  27. //
  28. //
  29. //
  30. // Related Topics 树 二叉搜索树 动态规划 回溯 二叉树
  31. // 👍 965 👎 0
  32. package leetcode.editor.cn;
  33. import com.qjx.leetcode.common.TreeNode;
  34. import java.util.ArrayList;
  35. import java.util.List;
  36. class UniqueBinarySearchTreesIi {
  37. public static void main(String[] args) {
  38. Solution solution = new UniqueBinarySearchTreesIi().new Solution();
  39. System.out.println(solution.generateTrees(3));
  40. }
  41. //leetcode submit region begin(Prohibit modification and deletion)
  42. /**
  43. * Definition for a binary tree node.
  44. * public class TreeNode {
  45. * int val;
  46. * TreeNode left;
  47. * TreeNode right;
  48. * TreeNode() {}
  49. * TreeNode(int val) { this.val = val; }
  50. * TreeNode(int val, TreeNode left, TreeNode right) {
  51. * this.val = val;
  52. * this.left = left;
  53. * this.right = right;
  54. * }
  55. * }
  56. */
  57. class Solution {
  58. public List<TreeNode> generateTrees(int n) {
  59. return helper(1, n);
  60. }
  61. /**
  62. * 终止条件 min> max 时 直接 返回rst
  63. * for 循环对每一个跟节点构建一个bst tree [min,max]
  64. * 左子树 ,右子树 递归
  65. * 1.如果 左右子树 都为0 时 直接返回单节点的一个bst
  66. * 2.如果左子树为0右子树不为0时,为当前的每一个右子树构建一个root,他的指针指向当前的右子树
  67. * 3.如果右子树为0,左子树不为0时,为当前的每一个左子树构建一个root,他的指针指向 当前的左子树
  68. * 4.如果都不为0 时,以当前节点构建一个root,遍历左右子树,指向有效的左右子树
  69. * 5.返回rst
  70. *
  71. * @param min
  72. * @param max
  73. * @return
  74. */
  75. private List<TreeNode> helper(int min, int max) {
  76. List<TreeNode> resut = new ArrayList<>();
  77. //终止条件 min> max 时 直接 返回rst
  78. if (min > max) {
  79. return resut;
  80. }
  81. //for 循环对每一个跟节点构建一个bst tree [min,max]
  82. for (int rt = min; rt <= max; rt++) {
  83. List<TreeNode> left = helper(min, rt - 1);
  84. List<TreeNode> right = helper(rt + 1, max);
  85. if (right.size() == 0 && left.size() == 0) {
  86. TreeNode root = new TreeNode(rt);
  87. resut.add(root);
  88. } else if (left.size() == 0) {
  89. for (TreeNode r : right) {
  90. TreeNode root = new TreeNode(rt);
  91. root.right = r;
  92. resut.add(root);
  93. }
  94. } else if (right.size() == 0) {
  95. for (TreeNode l : left) {
  96. TreeNode root = new TreeNode(rt);
  97. root.left = l;
  98. resut.add(root);
  99. }
  100. } else {
  101. //左右子树都不为0时
  102. for (TreeNode l : left) {
  103. for (TreeNode r : right) {
  104. TreeNode root = new TreeNode(rt);
  105. root.left = l;
  106. root.right = r;
  107. resut.add(root);
  108. }
  109. }
  110. }
  111. }
  112. return resut;
  113. }
  114. }
  115. //leetcode submit region end(Prohibit modification and deletion)
  116. }