题目大意
给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。
解题思路
- 递归方式
- 为每一个[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
//给你一个整数 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//////// Related Topics 树 二叉搜索树 动态规划 回溯 二叉树// 👍 965 👎 0package leetcode.editor.cn;import com.qjx.leetcode.common.TreeNode;import java.util.ArrayList;import java.util.List;class UniqueBinarySearchTreesIi {public static void main(String[] args) {Solution solution = new UniqueBinarySearchTreesIi().new Solution();System.out.println(solution.generateTrees(3));}//leetcode submit region begin(Prohibit modification and deletion)/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/class Solution {public List<TreeNode> generateTrees(int n) {return helper(1, n);}/*** 终止条件 min> max 时 直接 返回rst* for 循环对每一个跟节点构建一个bst tree [min,max]* 左子树 ,右子树 递归* 1.如果 左右子树 都为0 时 直接返回单节点的一个bst* 2.如果左子树为0右子树不为0时,为当前的每一个右子树构建一个root,他的指针指向当前的右子树* 3.如果右子树为0,左子树不为0时,为当前的每一个左子树构建一个root,他的指针指向 当前的左子树* 4.如果都不为0 时,以当前节点构建一个root,遍历左右子树,指向有效的左右子树* 5.返回rst** @param min* @param max* @return*/private List<TreeNode> helper(int min, int max) {List<TreeNode> resut = new ArrayList<>();//终止条件 min> max 时 直接 返回rstif (min > max) {return resut;}//for 循环对每一个跟节点构建一个bst tree [min,max]for (int rt = min; rt <= max; rt++) {List<TreeNode> left = helper(min, rt - 1);List<TreeNode> right = helper(rt + 1, max);if (right.size() == 0 && left.size() == 0) {TreeNode root = new TreeNode(rt);resut.add(root);} else if (left.size() == 0) {for (TreeNode r : right) {TreeNode root = new TreeNode(rt);root.right = r;resut.add(root);}} else if (right.size() == 0) {for (TreeNode l : left) {TreeNode root = new TreeNode(rt);root.left = l;resut.add(root);}} else {//左右子树都不为0时for (TreeNode l : left) {for (TreeNode r : right) {TreeNode root = new TreeNode(rt);root.left = l;root.right = r;resut.add(root);}}}}return resut;}}//leetcode submit region end(Prohibit modification and deletion)}

