不同的二叉搜索树

问题描述

给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?

示例:

输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:

   1         3     3      2      1
    \       /     /      / \      \
     3     2     1      1   3      2
    /     /       \                 \
   2     1         2                 3

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/unique-binary-search-trees

思路

由i个不同数字组成的二叉搜索树的数量,只与数字的数量i有关,与数的大小无关。
dp[i]代表n个节点数的树的种数。dp[0]、dp[1]均为1;
求n个节点构成的树的种类时,for(int j=1;j<=i;j++){dp[i]+=dp[j-1]*dp[i-j];},表示根节点为1
的时候树的种类加上根节点为2...一直加到根节点为n的树的种类。
外层循环for(int i=2;i<=n;i++)为了求出每次的dp[j-1]*dp[i-j]。

题解

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

标签: none

添加新评论