[LeetCode系列]卡特兰数(Catalan Number) 在求解独特二叉搜寻树(Unique Binary Search Tree)中的应用分析
2014-07-15 16:54
726 查看
本文原题: LeetCode.
给定 n, 求解独特二叉搜寻树 (binary search trees) 的个数.
什么是二叉搜寻树?
二叉查找树(Binary Search Tree),或者是一棵空树,或者是具有下列性质的二叉树:
若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
举个栗子,
给定 n = 3, 共有 5 个.
本题的解题思路如下:
设n对应的BST个数为h(n), n-1对应的个数为h(n-1)...依此类推.
那么,
把1放在根节点, 2...n放在右侧, 总种类是h(1) * h(n-1)
把2放在根节点, 1放在左侧, 3...n放在右侧, 总种类是h(2) * h(n-2)
....
把n放在根节点, 1...n-1放在左侧, 总种类是h(n-1) * h(1)
所以h(n) = h(1) * h(n-1) + h(2) * h(n-2) +...+ h(n-2) * h(2) + h(n-1) * h(1)
上述h(n)表达式即为卡特兰数.(幽兰止水的CSDN博客)
下面是实现的C++代码:
第一行做输入检测.
第二, 三行定义树的种类向量h, 长度为n+1, 定义h[0]值为1, 因为1节点的情况下只有1种可能.
之后是一个二层嵌套for循环, 大循环控制计算h的下标i, 小循环按照i的值依次计算h[1,2,3,...,n].
详细讲一下小循环, h[i]是当前计算的种类数, 它等于h[0]*h[i-1] + h[1]*h[i-2] + ... + h[i-1]*h[0] 和上面提到的卡特兰数相符. (需要注意的是, 每层小循环都需要前i-1个h的值.)
返回的是h
, 即h向量中的第n+1个数, 但对应于n个节点的情况.
[本代码存疑]
给定 n, 求解独特二叉搜寻树 (binary search trees) 的个数.
什么是二叉搜寻树?
二叉查找树(Binary Search Tree),或者是一棵空树,或者是具有下列性质的二叉树:
若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
举个栗子,
给定 n = 3, 共有 5 个.
1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
本题的解题思路如下:
设n对应的BST个数为h(n), n-1对应的个数为h(n-1)...依此类推.
那么,
把1放在根节点, 2...n放在右侧, 总种类是h(1) * h(n-1)
把2放在根节点, 1放在左侧, 3...n放在右侧, 总种类是h(2) * h(n-2)
....
把n放在根节点, 1...n-1放在左侧, 总种类是h(n-1) * h(1)
所以h(n) = h(1) * h(n-1) + h(2) * h(n-2) +...+ h(n-2) * h(2) + h(n-1) * h(1)
上述h(n)表达式即为卡特兰数.(幽兰止水的CSDN博客)
下面是实现的C++代码:
class Solution { public: int numTrees(int n) { if (n < 0) return 0; vector<int> h(n+1, 0); h[0] = 1; for(int i = 1; i <= n; i++) for (int j = 0; j < i; j++) h[i] += h[j] * h[i-j-1]; return h ; } };
第一行做输入检测.
第二, 三行定义树的种类向量h, 长度为n+1, 定义h[0]值为1, 因为1节点的情况下只有1种可能.
之后是一个二层嵌套for循环, 大循环控制计算h的下标i, 小循环按照i的值依次计算h[1,2,3,...,n].
详细讲一下小循环, h[i]是当前计算的种类数, 它等于h[0]*h[i-1] + h[1]*h[i-2] + ... + h[i-1]*h[0] 和上面提到的卡特兰数相符. (需要注意的是, 每层小循环都需要前i-1个h的值.)
返回的是h
, 即h向量中的第n+1个数, 但对应于n个节点的情况.
[本代码存疑]
相关文章推荐
- [LeetCode系列]卡特兰数(Catalan Number) 在求解独特二叉搜寻树(Unique Binary Search Tree)中的应用分析
- LeetCode题库解答与分析——#95. 不同的二叉查找树 IIUniqueBinarySearchTreeII
- [leetcode刷题系列]Recover Binary Search Tree
- Leetcode: Convert Sorted Array to Binary Search Tree 理解分析
- [Leetcode]Unique binary search tree
- LeetCode – Refresh – Unique Binary Search Tree II
- LeetCode 96: Unique Binary Search Tree
- Unique Binary Search Tree | LeetCode
- leetcode java unique binary search tree
- 【Leetcode】Unique Binary Search Tree II (DP)
- 【Leetcode】Unique Binary Search Tree in JAVA
- [leetcode刷题系列]Convert Sorted List to Binary Search Tree
- Leetcode: Unique Binary Search Tree II
- leetcode-unique binary search tree II
- [leetcode刷题系列]Unique Binary Search Trees
- 二叉树系列 - 二叉搜索树 - [LeetCode] 中序遍历中利用 pre节点避免额外空间。题:Recover Binary Search Tree,Validate Binary Search Tree
- leetcode unique binary search Tree
- [LeetCode] Unique Binary Search Tree
- 【LeetCode】Unique Binary Search Tree
- LeetCode详细分析 :: Recover Binary Search Tree [Tree]