Given an integer n, generate all structurally unique BST's (binary search trees) that store values 1...n.
For example,
Given n = 3, your program should return all 5 unique BST's shown below.
1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
这道题考查如何递归构建二叉树。是一道好题,不过还是参考了网上的答案才写出来。实在不行每道题写十遍,至少能背下来。慢慢理解。
代码写的比较直观了,每次在循环中选择第i个作为跟节点,那么它的左孩子跟右孩子的可能组成结构可以通过递归调用,返回,然后在遍历左孩子list, 右孩子list, 拼出一种组合,构建当前节点为根节点的子树,加载到result里,然后一层层往上返回。主要是得熟练写来,感觉对递归的一些用法理解还不是很好。
代码:
public List<TreeNode> generateTrees(int n) {
List<TreeNode> result = new ArrayList<>();
if(n <= 0){
return result;
}
result = buildTree(1, n);
return result;
}
private List<TreeNode> buildTree(int start, int end){
List<TreeNode> result = new ArrayList<>();
if(start>end){
result.add(null);
return result;
}
for(int i=start;i<=end;i++){
List<TreeNode> left = buildTree(start, i-1);
List<TreeNode> right = buildTree(i+1, end);
for(TreeNode leftiem: left){
for(TreeNode rightitem: right){
TreeNode curNode = new TreeNode(i);
curNode.left = leftiem;
curNode.right = rightitem;
result.add(curNode);
}
}
}
return result;
}