[LeetCode]Unique Binary Search Trees, 解题报告

原创 2013年12月05日 11:11:18

前言

今天准备把LeetCode上AC Rates在30%以上的题目全部收尾,这道题目也是我在这个AC Rate上遇到的感觉最麻烦的一道题目,分享一下自己的解题思路



而且这道题目AC Rate竟然这么高


题目

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.




思路

这道题目我想了两天,一直试图找出递推的规律,昨晚才想明白思路有问题,这应该是一道典型的动态规划题目,因为有重叠的子问题,当前决策依赖于子问题的解

我设dp[i]表示共有i个节点时,能产生的BST树的个数

n == 0 时,空树的个数必然为1,因此dp[0] = 1

n == 1 时,只有1这个根节点,数量也为1,因此dp[1] = 1

n == 2时,有两种构造方法,如下图所示:


因此,dp[2] = dp[0] * dp[1] + dp[1] * dp[0]

n == 3时,构造方法如题目给的示例所示,dp[3] = dp[0] * dp[2] + dp[1] * dp[1] + dp[2] * dp[0]

同时,当根节点元素为 1, 2, 3, 4, 5,  ..., i, ..., n时,基于以下原则的BST树具有唯一性:

以i为根节点时,其左子树构成为[0,...,i-1],其右子树构成为[i+1,...,n]构成

因此,dp[i] = sigma(dp[0...k] * dp[k+1...i]) 0 <= k < i - 1


代码

import java.util.Scanner;


public class UniqueBinarySearchTrees {
    public static int numTrees(int n) {
        int i, j, dp[] = new int[n + 1];

        if (n == 0) return 1;

        dp[0] = dp[1] = 1;

        for (i = 2; i <= n; i++) {
            dp[i] = 0;
            for (j = 0; j < i; j++) {
                dp[i] += dp[j] * dp[i - j - 1];
            }
        }

        return dp[n];
    }


    public static void main(String[] args) {
        int n, num;
        Scanner cin = new Scanner(System.in);

        while (cin.hasNext()) {
            n = cin.nextInt();
            num = numTrees(n);

            System.out.println(num);
        }

        cin.close();
    }
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

[leetcode] 96. Unique Binary Search Trees 解题报告

题目链接:https://leetcode.com/problems/unique-binary-search-trees/ Given n, how many structurally uniq...

LeetCode 96. Unique Binary Search Trees 解题报告

LeetCode 108. Convert Sorted Array to Binary Search Tree 解题报告

[Leetcode] 95. Unique Binary Search Trees II 解题报告

题目: Given an integer n, generate all structurally unique BST's (binary search trees) that store...

leetCode 95.Unique Binary Search Trees II (唯一二叉搜索树) 解题思路和方法

Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For ...

【LeetCode】Validate Binary Search Tree 解题报告

今天CSDN博客发生异常,折腾了大半天终于发出了这篇博文。 【题目】 Given a binary tree, determine if it is a valid binary sear...
  • ljiabin
  • ljiabin
  • 2014年12月03日 16:58
  • 8881

LeetCode Convert Sorted List to Binary Search Tree 解题报告

从给定的有序链表生成一颗平衡二叉树。 解题思路:最容易想到的就是利用数组生成二叉树的方法,找到中间节点作为二叉树的root节点,然后分别对左右链表递归调用分别生成左子树和右子树。时间复杂度O(N*lg...

[Leetcode] 255. Verify Preorder Sequence in Binary Search Tree 解题报告

题目: Given an array of numbers, verify whether it is the correct preorder traversal sequence of ...

【LeetCode】Lowest Common Ancestor of a Binary Search Tree 解题报告

Lowest Common Ancestor of a Binary Search Tree[LeetCode]https://leetcode.com/problems/lowest-common-...

[Leetcode] 99. Recover Binary Search Tree 解题报告

题目: Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree with...

LeetCode-Binary Search Tree Iterator-解题报告

原题链接https://leetcode.com/problems/binary-search-tree-iterator/ Implement an iterator over a binary ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[LeetCode]Unique Binary Search Trees, 解题报告
举报原因:
原因补充:

(最多只允许输入30个字)