【LeetCode】Unique Binary Search Trees 二叉查找树的个数

题目

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.
这里写图片描述

题目大意

给定n,输出所有以1-n为结点值的二叉查找树的个数

思路

二叉树分为左子树和右子树,确定了根节点,知道左子树的种类数left和右子树种类数right,整个二叉树种类数就是num=left*right。

另外题目是二叉查找树,需要保证前序遍历有序,所有每个取一个元素作为根节点的时候,就可以把前面的元素组成左子树,后面的元素组成右子树,这样,就变成了一个递归的问题。如下图:
这里写图片描述

以3个元素为例,如下:

  • 以1做根节点:【①,2,3】
    此时,只需考虑右子树【2,3】为元素,种类为2;
  • 以2做根节点:【1,②,3】
    此时,考虑左子树【1】为元素,右子树【3】为元素,种类为1;
  • 以3做根节点:【1,2,③】
    此时,只需考虑左子树【1,2】为元素,种类为2;
    所有总共有2+1+2=5种。

用c[i]表示i个元素的二叉查找树的种类数,则:
c[0] = 1
c[1] = 1
c[2] = ∑c[i]*c[2-i-1] = c[0]*c[1] + c[1]*c[0] = 1+1 = 2
c[3] = ∑c[i]*c[3-i-1] = c[0]*c[2] + c[1]*c[1] + c[2]*c[0] = 2+1+2 = 5
……
c[n] = ∑c[i]*c[n-i-1] (其中,i∈{1,2,…,n})

这里的c[n]有规律,并且是一种特殊的数,叫做:卡特兰数

但是递归的解法在这里会Time Limit Exceeded,因为时间复杂度是n*nlog(n)。
可以使用迭代的方法,时间复杂度是n^2 。
直接使用卡特兰数的通项公式,复杂度可以降为O(n)。

解答

递归的解法如下,提交不通过:

    public int numTrees(int n) {
        return numTreesHelper(1, n);
    }

    int numTreesHelper(int p,int q){
        if(p >= q)
            return 1;
        int num = 0;
        for(int i = p;i<=q;i++){
            int left = numTreesHelper(p, i-1);
            int right = numTreesHelper(i+1, q);
            num+=left*right;
        }
        return num;
    }

迭代的解法如下,可以Accept:

    public int numTrees(int n) {
        if(n<=1) return 1;
        int[] c = new int[n+1];
        c[0]=c[1]=1;
        for(int i=2; i<=n; i++) {
            for(int j=0; j<i; j++) {
                c[i] += c[j]*c[i-j-1];
            }
        }
        return c[n];
    }
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页