力扣(二叉树)——96. 不同的二叉搜索树

256 阅读1分钟

一、题示

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

示例 1: image.png

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

输入:n = 1 输出:1  

提示:

1 <= n <= 19

二、解题思路

根据一个有序序列 1⋯n,将其构建为二叉搜索树,遍历每个数字i,将该数字作为树根,将 1 ⋯(i−1) 序列作为左子树,将 (i+1)⋯n 序列作为右子树。接着以同样方式递归构建左子树和右子树。由于根值i的不同,就可保证每棵二叉搜索树的唯一性。

定义两个函数: 1、G(n): 长度为 n 的序列能构成的不同二叉搜索树的个数。

2、F(i, n): 以 i 为根、序列长度为 n 的不同二叉搜索树个数 (1≤i≤n)。

image.png

对于边界情况,当序列长度为 1(只有根)或为 0(空树)时,只有一种情况,即: G(0)=1,G(1)=1

F(i,n)=G(i1)G(ni)F(i,n)=G(i−1)⋅G(n−i)

递归公式:

image.png

三、代码实现

class Solution {
    public int numTrees(int n) {
        int[] G = new int [n+1];
        G[0]=1;
        G[1]=1;
        for(int i=2;i<=n;i++){
            //i的阶乘即为G(n)的可能性
            for(int j=1;j<=i;j++){
                G[i]+=G[j-1]*G[i-j];
            }
        }
        return G[n];
    }
}