0
点赞
收藏
分享

微信扫一扫

Leecode.96. 不同的二叉搜索树

殇感故事 2022-01-31 阅读 38
动态规划

1.题目描述:

        题目链接:力扣icon-default.png?t=M0H8https://leetcode-cn.com/problems/unique-binary-search-trees/

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

        示例1:

                输入:n=3;

                输出:5

        解释:

2.题目分析 :

        考点1:二叉搜索树

                二叉搜索树的左子树所有节点值都小于根节点,右子树所有节点值都大于根节点

                因此把1,2,3......n;分成两段,[1,root-1], root, [root+1,n]

        考点2:动态规划

                由二叉搜索树的特点,将n个数分成两段,那么能组成的总数就等于两段分别能组成的二叉搜索树总数的乘积;

                例如:数组:1,2,3,4,5;以3为root,那么此时的总数num[3]=dp[2]*dp[2](左子树:1,2;右子数:4,5);

                而dp[5]等于遍历数组,分别作为root计算出num[j],最后相加;

                状态转移方程:       

for(int j=0;j<i;j++){
    dp[i]+=dp[j]*dp[j-i];//每一次循环都是计算一次num[j]
}
//   dp[i]: 将1~n看作是长度为n的数组,dp[i]表示长度为i的节点数组能组成的二叉搜索树的数量

3.代码:

public int numTrees(int n){
    int[] dp=new int[n+1];
    dp[0]=1;//空树
    dp[1]=1;//当长度为0或者长度为1时,只能组成一种二叉搜索树
    for(int i=2;i<=n;i++){
        for(int j=0;j<i;j++){
            dp[i]+=dp[j]*dp[i-j];
        }
    }
    return dp[n];
}

举报

相关推荐

0 条评论