LeetCode 96 — Unique Binary Search Trees(C++ Java Python)

来源:互联网 发布:数据整理工具 编辑:程序博客网 时间:2024/06/05 00:59
题目:http://oj.leetcode.com/problems/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...n的BST(二叉查找树)?
例如,
给定n = 3,共有5种独特的BST。

分析:

        自底向上。对于i个节点的情况,将第j个节点作为根节点,则左子树有j-1个节点,右子树有i-j个节点,左右子树不同BST种数相乘即得到j为根节点时的总数,对j从1到i求和,即得到i个节点不同BST的总数。

        另外这是一种Catalan数,公式为C_n = \frac{1}{n+1}{2n \choose n} = \frac{(2n)!}{(n+1)!n!}

C++实现:
class Solution {public:    int numTrees(int n) {        vector<int> num(n + 1, 0);    num[0] = 1;    num[1] = 1;    for(int i = 2; i <= n; i++)    for(int j = 1; j <= i; j++)    {    num[i] += num[j - 1] * num[i - j];    }    return num[n];    }};
Java实现:
public class Solution {    public int numTrees(int n) {        int[] num = new int[n + 1];num[0] = 1;num[1] = 1;for (int i = 2; i <= n; ++i) {for (int j = 1; j <= i; ++j) {num[i] += num[j - 1] * num[i - j];}}return num[n];    }}
Python实现:
class Solution:    # @return an integer    def numTrees(self, n):        num = [0 for i in range(n + 1)]        num[0] = 1        num[1] = 1                for i in range(2, n + 1):            for j in range(1, i + 1):                num[i] += num[j - 1] * num[i - j]                return num[n]
        感谢阅读,欢迎评论!
0 0