给你一个整数 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
思路:把每一个数字作为根节点i,1...i-1 为左子树,i+1...n为右子树,把i的左右子树对应则获得i为根节点时的树,依次获得1...n作根节点时的树
package four;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.TreeMap;
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;
}
}
public class a8 {
public static List<TreeNode> search(int n) {
if (n < 1) return new LinkedList<TreeNode>();
return dfs(1, n);
}
public static List<TreeNode> dfs(int l, int r) {
List<TreeNode> list = new ArrayList<>();
if (l > r) {
list.add(null);
return list;
}
for (int i = l; i <= r; i++) {
List<TreeNode> left = dfs(l, i - 1);
List<TreeNode> right = dfs(i + 1, r);
for (TreeNode le : left) {
for (TreeNode ri : right) {
TreeNode head = new TreeNode(i);
head.left = le;
head.right = ri;
list.add(head);
}
}
}
return list;
}
}