給你一個(gè)整數(shù) n 注暗,請(qǐng)你生成并返回所有由 n 個(gè)節(jié)點(diǎn)組成且節(jié)點(diǎ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
解答
/**
* 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 generateBSTs(1, n);
}
public List<TreeNode> generateBSTs(int start, int end) {
List<TreeNode> treeList = new ArrayList<>();
if (start > end) return treeList;
// 以1-n進(jìn)行遍歷燕锥,對(duì)原數(shù)組進(jìn)行分隔
for (int i = start; i <= end; i++) {
List<TreeNode> leftTrees = generateBSTs(start, i-1);
List<TreeNode> rightTrees = generateBSTs(i+1, end);
if (leftTrees.isEmpty()) {
if (rightTrees.isEmpty()) treeList.add(new TreeNode(i));
else
for (TreeNode right : rightTrees)
treeList.add(new TreeNode(i, null, right));
} else if (rightTrees.isEmpty()) {
for (TreeNode left : leftTrees)
treeList.add(new TreeNode(i, left, null));
}
for (TreeNode left : leftTrees)
for (TreeNode right : rightTrees)
treeList.add(new TreeNode(i, left, right));
}
return treeList;
}
}