Given an integer n, generate all structurally uniqueBST'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
动态规划问题,当前节点左边和右边集合的结合.
需要注意的是引用对象,TreeNode保存的时候是引用.必须得生成新的,因为往往一个根节点可能对应不同的子树结构.
code:
<span style="font-size:14px;"><span style="font-size:14px;">/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<TreeNode> generateTrees(int n) {
if(n==0)
return new ArrayList<TreeNode>();
return generateHelp(1,n);
}
public List<TreeNode> generateHelp(int start,int end){
List<TreeNode> res=new ArrayList<TreeNode>();
if(start>end)
return null;
for(int i=start;i<=end;i++){
List<TreeNode> l = generateHelp(start,i-1);
List<TreeNode> r = generateHelp(i+1,end);
if(l==null&&r!=null){
for(int k=0;k<r.size();k++){
TreeNode temp=new TreeNode(i); //必须得重新生成根节点,因为是引用
temp.left=null;
temp.right=r.get(k);
res.add(temp);
}
}
else if(r==null&&l!=null){
for(int k=0;k<l.size();k++){
TreeNode temp=new TreeNode(i);
temp.left=l.get(k);
temp.right=null;
res.add(temp);
}
}
else if(l==null&&r==null){
TreeNode temp=new TreeNode(i);
temp.left=null;
temp.right=null;
res.add(temp);
}
else{
for(int j=0;j<l.size();j++){
for(int k=0;k<r.size();k++){
TreeNode temp=new TreeNode(i);
temp.left=l.get(j);
temp.right=r.get(k);
res.add(temp);
}
}
}
}
return res;
}
}</span></span>
96. Unique Binary Search Trees
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.
1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
分析就是返回总的数量: 动态规划
<span style="font-size:14px;">public class Solution {
public int numTrees(int n) {
if(n==0)
return 0;
int[] flag=new int[n+1];
flag[0]=1;
for(int i=1;i<=n;i++){
for(int j=0;j<i;j++){
flag[i]+=flag[j]*flag[i-j-1];
}
}
return flag[n];
}
}</span>