我有1,2,3,4 ...... n等元素。我想计算所有可能根的高度为h的二叉搜索树的数量
计算具有所有可能高度的二叉搜索树的数量:
int countTrees(int N) {
if (N <=1) {
return(1);
}
else {
int sum = 0;
int left, right, root;
for (root=1; root<=N; root++) {
left = countTrees(root - 1);
right = countTrees(N - root);
// number of possible trees with this root == left*right
sum += left*right;
}
return(sum);
}
}
在上面的程序中我想添加高度H的约束
修改 示例 -
Input N = 3 H = 3
我不想算高度大于H的树
Total No. of tree 5
There are 2 tree with root =1, 1 tree with root =2, 2 tree with root =3
我的最终答案是10(所有根节点数的总和)因此, 答案= 1 * 2 + 2 * 1 + 3 * 2 = 10
答案 0 :(得分:1)
/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
System.out.println(countTrees(3, 1, 3));
}
public static int countTrees(int N, int curH, int H) {
if ( curH > H ) return 0;
if (N <=1) {
return(1);
}
else {
int sum = 0;
int left, right, root;
for (root=1; root<=N; root++) {
left = countTrees(root - 1, curH+1, H);
right = countTrees(N - root, curH+1, H);
// number of possible trees with this root == left*right
sum += left*right;
}
return(sum);
}
}
}
我不保证这是正确的,但总体思路 - 修剪高度大于H
这个alg对于大N来说非常慢,有更快的解决方案(尽管没有H
约束):http://techieme.in/count-binary-search-trees/
答案 1 :(得分:1)
你已经完成了90%以上的工作,请允许我做其余的工作。
我试图保持大部分代码相同。
如果我们不想计算高度超过给定h的树的数量,我们就不会调用相应的递归调用。
该函数将从主函数中调用:
countTrees(3,2,0);
N = 3 , H = 2 , 0是从根向下路径遍历的边数。
代码中的数组 arr 长度为3,它是全局的, arr [i] 将根据 i +给出树的数量1 强>
int countTrees(int N,int h,int l) {
if (N <=1) {
return(1);
}
else {
int sum=0;
int left, right, root;
for (root=1; root<=N; root++) {
left=0;right=0;
if(l+1<=h)
{
left = countTrees(root - 1,h,l+1);
right = countTrees(N - root,h,l+1);
if(l==0)
arr[root-1]+=left*right;
sum+=left*right;
}
}
return sum;
}
}
答案 2 :(得分:0)
方式可能是将第三个参数传递给countTrees(height)并添加一个条件,如果h大于某些东西,则返回(显然,当你递归调用函数时,你可以增加该参数)