题目描述:给定一个值n,能构建出多少不同的值包含1...n的二叉搜索树(BST)?
例如:给定 n = 3, 有五种不同的二叉搜索树(BST)
示例1:
输入:3
返回值:5
思路:对于值为n(包含1...n)的二叉搜索树而言,由于二叉搜索树具有下列性质:
二叉搜索树左节点的值小于根节点,根节点的值小于右节点。所以一棵二叉搜索树可以这样唯一确定,先确定根节点,然后划分为左右子树两个集合,这样二叉搜索树的数目为左子树个数 乘以 右子树的个数.
首先,易知 r(0) = 1 ;r(1) = 1 ;因此,要知道 r(n),可从根节点root出发,对于值为n的二叉搜索树而言,根节点可能为1、2、3、4...n中的任意一个,则分为如下n种情况:
如果根节点为1,则左子树中的节点集合为 {NULL} ,右子树中的节点集合为{2,3,...,n} 共 n-1 个节点,共有 r(0)Xr(n-1) 种二叉搜索树。
如果根节点为2,则左子树中的节点集合为 {NULL,1} , 右子树中的节点集合为{3,...,n} 共 n-2 个节点,共有 r(1)Xr(n-2) 种二叉搜索树。
如果根节点为 i ,则左子树中的节点集合为 {NULL,1,2,...,i-1} ,右子树中的节点集合为{i+1,i+2,...,n} 共 n-i 个节点,共有 r(i-1)Xr(n-i) 种二叉搜索树.
如果根节点为n,则左子树中的节点集合为 {NULL,1,2,...,n-1} ,右子树中的节点集合为{} 共 0 个节点,共有 r(n-1)Xr(0) 种二叉搜索树.
最终对应递推关系公式为 r(n) += r(i-1)*r(n-i), 其中i=1,2,...n.具体代码按如下:
class Solution { public: /** * * @param n int整型 * @return int整型 */ int numTrees(int n) { // write code here //思路就是找规律,每个都可以作为根节点,然后分为两部分,一部分为左子树,一部分为右子树,左子树小于根节点,右子树大于根节点 //定义全为0且长度为j+1的一维数组,找规律发现递推公式 //r(0) = 1 //r(1) = 1 //r(n) += r(i-1)*r(n-i), 其中i=1,2,...n vector<int> r(n+1,0); r[0] = r[1]=1; for(int i=2;i<=n;i++) { for(int j=1;j<=i;j++) r[i]+=r[j-1]*r[i-j]; } return r[n]; } };