Question:
Given 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
confused what "{1,#,2,3}"
means? > read more on how binary tree is serialized on OJ.
方法:
最牛的方法是Catalan Numbers。但是显然这道题的难度已经超过了一般的递归,如果再去把心思放到一个极难证明的数学式上,十分的勉强。
因此我只做了递归的方法:对于递归,必须首先弄明白的是题目的运作原理,其次是递归式条件是什么,返回什么,两者一结合,三步完成。
对于这道题,每一个节点的左右都有数种排序方法,因此用了三层循环,完成了左右相乘的目的。
Code:
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; left = null; right = null; }
* }
*/
public class Solution {
public ArrayList<TreeNode> generateTrees(int n) {
// Start typing your Java solution below
// DO NOT write main() function
return treeImp(1, n);
}
private ArrayList<TreeNode> treeImp(int start, int end){
ArrayList<TreeNode> res = new ArrayList<TreeNode>();
if(start > end){
res.add(null);
return res;
}
for(int i=start; i<=end; i++)
for(TreeNode left : treeImp(start, i-1))
for(TreeNode right : treeImp(i+1, end)){
TreeNode root = new TreeNode(i);
root.left = left;
root.right = right;
res.add(root);
}
return res;
}
}
总结:
递归的话很难解释却很好理解,这也是为我自己语言组织能力有限找的一个借口,对不起。