给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树。
示例:
输入: 3
输出:
[
[1,null,3,2],
[3,2,null,1],
[3,1,null,null,2],
[2,1,3],
[1,null,2,null,3]
]
解释:
以上的输出对应以下 5 种不同结构的二叉搜索树:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
解题思路:
二叉搜索树:左子树的所有元素小于根节点,右子树的所有元素大于根节点,并且左子树和右子树也分别时二叉搜索树
null 1 [2~n]
[1] 2 [3~n]
.
.
.
[1~n-2] n-1 [n]
[1~n-1] n null
按照上述顺序分别构造左子树、根节点、右子树,对于包含多个节点的子树,递归构造子二叉搜索树
Java代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<TreeNode> generateTrees(int n) {
if(0 == n){
return new ArrayList<>();
}
return generateTrees(0, n);
}
private List<TreeNode> generateTrees(int start, int end){
List<TreeNode> res = new LinkedList<>();
if(start == end){
res.add(null);
return res;
}
if(start+1 == end){
res.add(new TreeNode(start+1));
} else if(start+2 == end){
TreeNode start1 = new TreeNode(start+1);
TreeNode end1 = new TreeNode(start+2);
start1.right = end1;
res.add(start1);
TreeNode start2 = new TreeNode(start+1);
TreeNode end2 = new TreeNode(start+2);
end2.left = start2;
res.add(end2);
} else {
for(int i = start; i < end; i++){
List<TreeNode> left = generateTrees(start, i);
List<TreeNode> right = generateTrees(i+1, end);
for(int m = 0; m < left.size(); m++){
for(int n = 0; n < right.size(); n++){
TreeNode root = new TreeNode(i+1);
root.left = left.get(m);
root.right = right.get(n);
res.add(root);
}
}
}
}
return res;
}
}