题目大意
给你一个整数 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 👎 0
package 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 时 直接 返回rst
if (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)
}