leetcode每日一题-「不同的二叉搜索树」

67 阅读1分钟

【题目标题】

不同的二叉搜索树

【题目描述】

给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。

示例 1: 输入:n = 3 输出:5

示例 2: 输入:n = 1 输出:1

提示: 1 <= n <= 19

【解题思路】

【动态规划法】

要求n个节点组成且节点值从1到n互不相同的二叉搜索树有多少种。

二叉搜索树,其左子树上的值小于根节点的值,其右子树上的值大于根节点的值。

假设n=7,那么对于数组[1,2,3,4,5,6,7]来说,根节点=4来说,其互不相同的二叉搜索树为其左子树[1,2,3]所有不同二叉搜索树和其右子树[5,6,7]所有不同二叉搜索树的笛卡尔积。而整个数组的互不相同的二叉搜索树,需要遍历整个数组,每个数字当做根节点的所有结果之和。

所以这是一个很明显的动态规划问题,按照上面的举例表述,我们假设G(n)整个数组的不同二叉搜索树数量,F(i,n)为根节点为i的不同二叉搜索树数量,那么和显然G(n)=F(1,n)+F(2,n)+...+F(n,n),而F(i,n)=G(i-1)*G(n-i),所以G(n)=G(0)*G(n-1)+G(1)*G(n-2)+...+G(n-1)*G(0)

image.png

【代码实现】

class Solution {
    public int numTrees(int n) {
        int[] numTrees = new int[n+1];
        numTrees[0] = 1;
        numTrees[1] = 1;
        for(int i = 2; i <= n; i++) {
            for(int j = 1; j <= i; j++) {
                numTrees[i] += numTrees[j-1]*numTrees[i-j];
            }
        }
        return numTrees[n];
    }
}