Given n, how many structurally unique BST’s (binary search trees) that store values 1…n?
For example,
Given n = 3, there are a total of 5 unique BST’s.
首先普及一下BST树,BST(Binary Search Tree),二叉查找树;
性质:
若结点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
若结点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
该结点的左、右子树也分别为二叉查找树;
也就是说BST树的中序遍历是递增的。
这道题就是给出节点,找到BST树有几种形式。
开始考虑就是用DP的思想,先列出了f(1)和f(2)的情况。然后思考怎么转移到f(3)的状态,只要固定住根节点,然后将剩下的节点在左右节点分配就行,分配的问题就能够用f(2)来求解了。所以会得出一张表,记录从f(1)到f(n-1)的种数,f(n)就可以直接计算出来了:
f(3) = f(0)f(2) + f(1)f(1) + f(0)(2)
public int numTrees(int n) {
int[] arrays = new int[n + 1];
arrays[0] = 1;
arrays[1] = 1;
arrays[2] = 2;
for(int i = 3;i <= n;i++){
for(int j = 0;j < i;j++){
arrays[i] += arrays[j] * arrays[i - j - 1];
}
}
return arrays[n];
}
19 / 19 test cases passed.
Status: Accepted
Runtime: 228 ms
Unique Binary Search Trees II是要在I的基础上再输出树的形状,同样用DP方法解,把问题分解为根节点、左子树和右子树。比根节点小的都放在左子树,大的放在右子树,用递归建树即可。子树的构建调用DP生成的树表。
public List<TreeNode> generateTrees(int n) {
return createTree(1, n);
}
public List<TreeNode> createTree(int start, int end){
List<TreeNode> resultList = new ArrayList<TreeNode>();
if(start > end){
resultList.add(null);
return resultList;
}
for(int k = start;k <= end;k++){
List<TreeNode> left = createTree(start, k - 1); //left tree
List<TreeNode> right = createTree(k + 1, end); //right tree
for(int i = 0;i < left.size();i++){
for(int j = 0;j < right.size();j++){
TreeNode root = new TreeNode(k);
root.left = left.get(i);
root.right = right.get(j);
resultList.add(root);
}
}
}
return resultList;
}
9 / 9 test cases passed.
Status: Accepted
Runtime: 292 ms