[Java]LeetCode96 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
给定一个n值,那么从1.2.3....N共N个数,能构建几棵二叉排序树。

解题思路就是:遍历1至N个数,求它们每个元素作为根节点的情况,根据中序遍历的思想,小于根节点的排在左边,大于根节点的排在右边。求出左边子二叉树的构建数目和右二叉树的构建数目,相乘就得到该二叉树的数目了。该题是不是感觉又可以根据递归的思路来解了。

递归思路:

 public int numTrees(int n) {
       if(n==0||n==1)return 1;
       if(n==2)return 2;
       int num=0;
       for(int i=1;i<=n;i++)//根节点
       {
           num+=numTrees(i-1)*numTrees(n-i);//左子树二叉排序树的构建数目*右子树二叉排序树的构建数目
       }
       return num;
    }
虽然逻辑是对的,但是leetcode提示timeLimited。也就是递归超时了。

那我们试一试将已经作为根节点求解的构建数目先用数组保存起来,然后后面的节点求解的时候再调用。

1)先定义一个array

2)array[0]表示节点数为0的情况,array[0]=1;

3)array[1]表示1个节点的求解只有一种情况:左节点的个数和右节点个数都为0即a[0]*a[0];

4)array[2]表示2个节点的求解只有两种情况:左节点的个数和右节点个数都为a[1]*a[0],a[0]*a[1]

5)array[3]表示3个节点的求解只有三种情况:左节点的个数和右节点个数为a[2]*a[0],a[1]*a[1],a[0]*a[2]

以此类推

我们用代码实现如下

public int numTrees(int n) {
       int[] array=new int[n+1];
       array[0]=1;
       for(int i=1;i<=n;i++)
       {
         for(int j=0;j<i;j++)
         {
          array[i]+=array[j]*array[i-j-1];
         }
       }
       return array[n];
    }


                                                                                    



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值