`
bcyy
  • 浏览: 1937306 次
文章分类
社区版块
存档分类
最新评论

Unique Binary Search Trees -- LeetCode

 
阅读更多
原题链接:http://oj.leetcode.com/problems/unique-binary-search-trees/
这道题要求可行的二叉查找树的数量,其实二叉查找树可以任意取根,只要满足中序遍历有序的要求就可以。从处理子问题的角度来看,选取一个结点为根,就把结点切成左右子树,以这个结点为根的可行二叉树数量就是左右子树可行二叉树数量的乘积,所以总的数量是将以所有结点为根的可行结果累加起来。写成表达式如下:
熟悉卡特兰数的朋友可能已经发现了,这正是卡特兰数的一种定义方式,是一个典型的动态规划的定义方式(根据其实条件和递推式求解结果)。所以思路也很明确了,维护量res[i]表示含有i个结点的二叉查找树的数量。根据上述递推式依次求出1到n的的结果即可。
时间上每次求解i个结点的二叉查找树数量的需要一个i步的循环,总体要求n次,所以总时间复杂度是O(1+2+...+n)=O(n^2)。空间上需要一个数组来维护,并且需要前i个的所有信息,所以是O(n)。代码如下:
public int numTrees(int n) {
    if(n<=0)
        return 0;
    int[] res = new int[n+1];
    res[0] = 1;
    res[1] = 1;
    for(int i=2;i<=n;i++)
    {
        for(int j=0;j<i;j++)
        {
            res[i] += res[j]*res[i-j-1];
        }
    }
    return res[n];
}
这种求数量的题目一般都容易想到用动态规划的解法,这道题的模型正好是卡特兰数的定义。当然这道题还可以用卡特兰数的通项公式来求解,这样时间复杂度就可以降低到O(n)。因为比较直接,这里就不列举代码了。
如果是求解所有满足要求的二叉树(而不仅仅是数量)那么时间复杂度是就取决于结果的数量了,不再是一个多项式的解法了,有兴趣的朋友可以看看Unique Binary Search Trees II
分享到:
评论

相关推荐

    python-leetcode题解之095-Unique-Binary-Search-Trees-II

    今天,我们聚焦于LeetCode上的第95题“Unique Binary Search Trees II”,该题目要求参与者使用给定的数值序列构建所有可能的不同二叉搜索树(BSTs)。二叉搜索树是一种特殊的二叉树,其中每个节点都满足以下性质:...

    c语言-leetcode题解之0095-unique-binary-search-trees-ii.zip

    LeetCode作为一个广泛使用的在线编程平台,提供了众多关于二叉搜索树的问题,其中问题编号0095 “Unique Binary Search Trees II”是一个典型的问题,旨在考察解题者对二叉搜索树性质的理解以及递归思维的应用。...

    js-leetcode题解之95-unique-binary-search-trees-ii.js

    在LeetCode中,问题编号95的题目就是要求生成给定节点数的所有可能的唯一二叉搜索树(Unique Binary Search Trees II)。该问题是一个典型的递归问题,可以通过深度优先搜索(DFS)算法来解决。 问题的描述是这样的...

    python-leetcode题解之096-Unique-Binary-Search-Trees

    题目描述:096-Unique Binary Search Trees(不同的二叉搜索树)是LeetCode上的一个算法问题,编号96。问题的目标是找出给定节点数n的所有不同的二叉搜索树(BST)的个数。二叉搜索树是一类特殊的二叉树,其中每个...

    js-leetcode题解之96-unique-binary-search-trees.js

    代码示例中的js_leetcode题解之96-unique-binary-search-trees.js,会提供一个具体的解决方案。这个解决方案会涉及如何初始化dp数组,如何通过循环和乘法操作来填充数组,以及最终返回dp[n]的结果,即为题目所求的...

    c语言-leetcode题解之0096-unique-binary-search-trees.zip

    而“unique binary search trees”这一概念,则通常出现在动态规划的上下文中。这个问题在LeetCode上被标记为第96题,要求编写程序来计算给定数字n所能构成的不同形状的唯一二叉搜索树(BST)的数量。这里的关键在于...

    算法-leetcode-剑指offer上的题很多

    - **唯一二叉搜索树(Unique Binary Search Trees)**: 不同的二叉搜索树的数量。 #### 位操作技巧 - **更新位(Update Bits)**: 在一个整数中更新若干位。 - **快速幂(Fast Power)**: 快速计算一个数的幂。 #### ...

    LeetCode最全代码

    * [Binary Search Tree](https://github.com/kamyu104/LeetCode#binary-search-tree) * [Breadth-First Search](https://github.com/kamyu104/LeetCode#breadth-first-search) * [Depth-First Search]...

    leetcode添加元素使和等于-Leetcode-tree:力码树

    Leetcode-tree 94题 Binary Tree Inorder Traversal 对于树的问题,大多数我们都会使用递归的方法。原因是树的左子树也是树,右子树也是树,使用递归的方法最简单快捷。这道题是需要我们用Inorder的顺序输出节点。in...

    leetcode卡-leetcode:Python

    【描述】中的"Unique Binary Search Trees"提到了一种特定的LeetCode问题,即"唯一的二叉搜索树"。这个问题要求计算给定整数n的所有不同结构的二叉搜索树的数量。二叉搜索树是一种特殊的二叉树,其中每个节点的左...

    leetcode1477-coding-for-fun:编码乐趣

    96.unique-binary-search-trees.cpp [TODO] 70. 爬楼梯.cpp [TODO] 746. min-cost-climbing-stairs.cpp 第 4 天: [待办事项] leetcode/1143。 最长公共子序列.cpp 第 5 天: [待办事项] leetcode/221。 最大平方....

    leetcode答案-LeetCodeSolution:这是LeetCode网站问题的解决方案集

    Unique Binary Search Trees 本题参考了 里面的*How Many Binary Trees Are There?*章节。 The first few terms: C(0) = 1 C(1) = C(0)C(0) = 1 C(2) = C(0)C(1) + C(1)C(0) = 2 C(3) = C(0)C(2) + C(1)C(1)

    leetcodepython001-Algorithm:关于数据结构和算法的问题(Leetcode、编程之美和课程作业)

    leetcode python 001 Algorithm 用python和java解决了Leetcode上部分问题,另外还有对常规算法和机器学习算法的一些实现,例如用遗传算法解物流配送问题。...Search Trees Python 2017/11/28 Medium 09

    算法学习笔记

    - Unique Binary Search Trees:不同的二叉搜索树的个数。 - Happy Number:一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为1,也可能是无限...

Global site tag (gtag.js) - Google Analytics