您的位置:首页 > 其它

【Leetcode】96. 不同的二叉搜索树

2019-03-11 19:10 225 查看

QUESTION

medium

题目描述

给定一个整数

n
,求以
1 ... n
为节点组成的二叉搜索树有多少种?

示例:

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

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

说明

注意是

BST

SOLUTION

首先上来应该思考二叉搜索树的性质,左子树节点值小于根,右子树相反,那么有(注意了,下面的

左(0)
表示,左子树包含0个节点)

  • n = 1, 1 种
  • n = 2, 2 种,左(0)*右(1),左(1)*右(0)
  • n = 3, 5 种,左(0)*右(2),左(1)*右(1),左(2)*右(0)
  • n = n, x 种,x = dp[0]*dp[n-1] + dp[1]*dp[n-2] + … + dp[n-1]*dp[0]

原来是个动态规划问题

方法一

直接两层循环一直求到

dp

int numTrees(int n) {
if(n <= 1) return n; //n = 0, 1的情况直接返回就可以了
int *dp = new int[n + 1];
dp[0] = 1; //这里不能设0,要设1
dp[1] = 1;
for(int l = 2; l <= n; l++){
dp[l] = 0;
for(int i = 0; i < l; i++){
dp[l] += dp[i] * dp[l-i-1];
}
}
int res = dp[n];
delete []dp; //释放内存是好习惯
return res;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: