计算n个元素上所有可能根的高度为h的二叉搜索树的数量

时间:2015-08-08 08:19:02

标签: java c++ algorithm tree binary-search-tree

我有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

3 个答案:

答案 0 :(得分:1)

检查http://ideone.com/okPqj9

/* 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大于某些东西,则返回(显然,当你递归调用函数时,你可以增加该参数)