不同的二叉搜索树
程序员文章站
2022-07-16 13:12:28
...
上来着实被吓了一跳。
定义一个数组 dp[i]用来表示i个节点可以定义多少种二叉树。
一棵二叉树有多少种定义方式:左孩子节点数的种类右孩子节点的种类根节点的个数
第二层循环表示i个节点时,第j个节点作为根节点的情况
public int numTrees(int n) {
int[] dp = new int[n+1];
dp[0]=1;
dp[1]=1;
for(int i=2;i<=n;i++){
for(int j=0;j<i;j++){
dp[i] += dp[j]*dp[i-j-1];
}
}
return dp[n];
}
public List<TreeNode> generateTrees(int n) {
if(n==0) return new ArrayList<TreeNode>();
return generate(1,n);
}
public List<TreeNode> generate(int a,int b){
LinkedList<TreeNode> all_trees = new LinkedList<TreeNode>();
if (a > b) {
all_trees.add(null);
return all_trees;
}
for(int i=a;i<=b;i++){
List<TreeNode> left_trees = generate(a, i - 1);
List<TreeNode> right_trees = generate(i + 1, b);
for(TreeNode left: left_trees){
for(TreeNode right:right_trees){
TreeNode current_tree = new TreeNode(i);
current_tree.left = left;
current_tree.right = right;
all_trees.add(current_tree);
}
}
}
return all_trees;
}
上一篇: JavaEye2.0网站上线
下一篇: nginx学习之epoll