LeetCode-96. Unique Binary Search Trees

来源:互联网 发布:亲情关怀是什么软件 编辑:程序博客网 时间:2024/06/05 01:05

一、问题描述

  1. 给定整数n,表示有n个二叉树节点,并且节点的数值是从1-n,无重复,现在计算这n个树节点所能构成的二叉查找树的个数。
  2. 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

二、解题思路

  1. 一开始的思路是用递归来求解,n个节点轮流做中间节点,分别计算左边节点构成的二叉树的数目和右边节点构成的二叉树的数目,然后两个数相乘就是该节点作为中间节点的数目,然后累加各个节点作为中间节点的数目就是最终的答案,思路没问题,但是超时!!!
  2. 然后想到用动态规划,基本思路和1相同,但是用一个数组记录n为较小值的答案,然后利用这些计算较大n值的,这样不用递归了。
三、代码

第一种递归超时的解法:

public class Solution {    int[] result;    public int numTrees(int n) {        /*        if(n<=1)            return 1;        result=new int[n+1];        result[0]=1;        result[1]=1;        for(int i=2;i<n+1;i++){            core(i);        }        return result[n];        */                if(n<=1)            return 1;        //if(n==1)        //    return 1;        int result=0;        for(int i=1;i<=n;i++){            int left=numTrees(i-1);            int right=numTrees(n-i);            result+=(left*right);        }        return result;                }    private void core(int n){        int tem=0;        for(int i=1;i<=n;i++){            int left=result[i-1];            int right=result[n-i];            tem+=(left*right);        }        result[n]=tem;    }        }
第二种动态规划的解法
public class Solution {    int[] result;    public int numTrees(int n) {                if(n<=1)            return 1;        result=new int[n+1];        result[0]=1;        result[1]=1;        for(int i=2;i<n+1;i++){            core(i);        }        return result[n];        /*        if(n<=1)            return 1;        //if(n==1)        //    return 1;        int result=0;        for(int i=1;i<=n;i++){            int left=numTrees(i-1);            int right=numTrees(n-i);            result+=(left*right);        }        return result;        */        }    private void core(int n){        int tem=0;        for(int i=1;i<=n;i++){            int left=result[i-1];            int right=result[n-i];            tem+=(left*right);        }        result[n]=tem;    }        }