[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];
    }


                                                                                    



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。