来源Leetcode第96题不同的二叉搜索树
给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?
示例:
1 | 输入: 3 |
动态规划
来源官方题解
给定一个有序序列 1 ... n
,为了根据序列构建一棵二叉搜索树。我们可以遍历每个数字 i
,将该数字作为树根,1 ... (i-1)
序列将成为左子树,(i+1) ... n
序列将成为右子树。于是,我们可以递归地从子序列构建子树。
在上述方法中,由于根各自不同,每棵二叉树都保证是独特的。
可见,问题可以分解成规模较小的子问题。因此,我们可以存储并复用子问题的解,而不是递归的(也重复的)解决这些子问题,这就是动态规划法。
假设n个节点存在二叉排序树的个数是G(n),令f(i)为以i为根的二叉搜索树的个数,则G(n)=f(1)+f(2)+f(3)+f(4)+…+f(n)
当i为根节点时,其左子树节点个数为i-1个,右子树节点为n-i,则
f(i) = G(i−1)\∗G(n−i)
综合两个公式可以得到 卡特兰数 公式G(n)=G(0)∗G(n−1)+G(1)∗(n−2)+…+G(n−1)∗G(0)
1 | public int numTrees(int n) { |