码迷,mamicode.com
首页 > 编程语言 > 详细

[Java]LeetCode96 Unique Binary Search Trees

时间:2015-04-03 11:23:40      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:leetcode

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


                                                                                    



[Java]LeetCode96 Unique Binary Search Trees

标签:leetcode

原文地址:http://blog.csdn.net/fumier/article/details/44851723

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!