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
  • 思路

    这道题和LeetCode上面的95题几乎一样,但是这道题更加简单,因为只需要求解个数。这道题显然可以使用递归的思路去解决,但是可能递归算法的效率没有递推算法高。因此这里决定使用递推的方法。
    递推的思路可以这样去求解,n个数字的情况有这样几种情况:左边有n-1,右边为0个节点;左边有n-2个节点,右边有1个节点;左边有n-m个节点,右边有 m-1个节点,直到m=n,我们如果需要求n,就要先求出n-1等情况。因此我们可以先求出r=1时、然后就r=2,继续求r=3直到r=n。代码见下。

  • 代码(c#)
 public int NumTrees(int n)
        {
            if (n == 0) return 0;
            int[,] arr = new int[n + 1, n + 1];//使用二维数组记录已求解的情况个数
            arr[0, 0] = 1;//左右节点都没有,只有1中情况
            arr[1, 0] = 1;//只有一个右节点,1种情况
            arr[0, 1] = 1;//只有一个左节点,1种情况
            for (int i = 2; i <= n; i++)
            {
                for (int j = 0; j < i; j++)
                {
                    int result = 0;
                    if (j != 0 && (i - j - 1) != 0)
                    {
                        result = arr[j, 0] * arr[0, i - j - 1];//左右两边都有节点,那该节点共有左边*右边种情况
                    }
                    else
                    {
                        result = arr[j, i - j - 1];
                    }
                    arr[0, i] += result;//将所有的可能情况相加
                }
                arr[i, 0] = arr[0, i];//左边有i个节点情况=右边有i个节点的情况
            }
           return arr[0, n];
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值