uacs2024

导航

leetcode96-不同的二叉搜索树

96. 不同的二叉搜索树

 

首先,二叉搜索树的基本性质:对于某个结点,若有左孩子,那么它的左孩子比它小。若有右孩子,那么右孩子比它大。

这里的dp[n]数组表示从1,...,n可以构成多少个二叉搜索树。

sum+=(dp[j]*dp[i-j-1]),以求解dp[10]为例

表示    顶点左边0个结点,右边9个结点、    左边1个结点,右边8个结点、    左边2个结点,右边7个结点、...、    左边9个结点,右边0个结点的所有情况

            这个可以1为顶点                              这个可以2为顶点                         这个可以3为顶点                               这个可以10为顶点

                                                                                                                        比如这个右边7个,即【4,10】的组合和【1,7】的组合是等价的                         

class Solution {
public:
    int numTrees(int n) {
        if(n==1) return 1;
        vector<int> dp(n+1,0);
        dp[0]=1;dp[1]=1;dp[2]=2;//这里为了方便,把空子树也当作一种情况
        for(int i=3;i<=n;i++)
        {
            int sum=0;
            for(int j=0;j<=i-1;j++)
            {
                sum+=(dp[j]*dp[i-j-1]);  //比如求dp[10],就将dp[0]*dp[9],dp[1]*dp[8],dp[2]*dp[7],...,dp[8]*dp[1],dp[9]*dp[0]相加
            }
            dp[i]=sum;
        }
        return dp[n];
    }
};

 

posted on 2022-11-20 19:57  ᶜʸᵃⁿ  阅读(13)  评论(0编辑  收藏  举报