Leetcode:96. 不一样的二叉搜索树

Leetcode:96. 不一样的二叉搜索树

Leetcode:96. 不一样的二叉搜索树编程

题目在连接中,点进去看看吧!数组

先介绍一个名词:卡特兰数spa

卡特兰数

卡特兰数Cn知足如下递推关系:
\[ C_{n+1}=C_0C_n+C_1C_{n-1}+...+C_nC_0 \]
有兴趣的同窗点击这里查看亚特兰数的百度百科code

很巧的是,这道题能够利用亚特兰数计算出有多少个不一样的BST。leetcode

Don't talk,show me code!

class Solution {
public:
    int numTrees(int n) {
        vector<int> dp(n+2);
        dp[0]=1;
        for(int i=1;i<=n;i++){
            int temp=i-1;
            while(temp>=0){
                dp[i]+=dp[temp]*dp[i-temp-1];
                temp--;
            }  
        }
        return dp[n];
    }
};

简单分析

这道题利用的是动态规划的思想,递推得出一个dp数组。在找规律的过程当中,咱们意外发现这道题的答案与亚特兰数的数学递推式dp方程彻底一致!get

前提条件:这是一颗BST树,中序遍历得出的排列等于其升序排列数学

  1. 首先,当结点数为0时,树的个数为1it

  2. 分析当结点数为1时:io

    1. 取1为根节点,则左子树的结点数为0,右子树的结点数为0
    2. 所以结点数为1的左右子树状况为\(1*1=1\)
  3. 分析当结点数为2时:class

    1. 取1为根节点,则左子树的结点数为0,右子树的结点数为1
    2. 所以1根节点全部可能出现的树状况为\(1*1=1\)
    3. 取2为根节点,则左子树的结点数为1,右子树的结点数为0
    4. 所以2根节点全部可能出现的树状况为\(1*1=1\)
    5. 所以结点数为2的左右子树状况为\(1+1=2\)
  4. 分析当结点数为3时:

    1. 取1为根节点,则左子树的结点数为0,右子树的结点数为2
    2. 所以1根节点全部可能出现的树状况为\(1*2=2\)
    3. 取2为根节点,则左子树的结点数为1,右子树的结点数为1
    4. 所以2根节点全部可能出现的树状况为\(1*1=1\)
    5. 取2为根节点,则左子树的结点数为2,右子树的结点数为0
    6. 所以3根节点全部可能出现的树状况为\(2*1=2\)
    7. 所以结点数为3的左右子树状况为\(1+2+1=5\)
  5. 有兴趣能够继续递推,总之总结规律:
    \[ dp[k]=\sum_0^{k-1} dp[i]*dp[k-i-1] \]

  6. 而后就是编程实现啦~

相关文章
相关标签/搜索