首页 > 代码库 > [LeetCode系列]卡特兰数(Catalan Number) 在求解独特二叉搜寻树(Unique Binary Search Tree)中的应用分析
[LeetCode系列]卡特兰数(Catalan Number) 在求解独特二叉搜寻树(Unique Binary Search Tree)中的应用分析
本文原题: LeetCode.
给定 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++代码:
1 class Solution { 2 public: 3 int numTrees(int n) { 4 if (n < 0) return 0; 5 vector<int> h(n+1, 0); 6 h[0] = 1; 7 8 for(int i = 1; i <= n; i++) 9 for (int j = 0; j < i; j++) 10 h[i] += h[j] * h[i-j-1];11 12 return h[n];13 }14 };
对于此代码本人有一个疑惑, 就是为何h(n) = h(0) * h(n-1) +... 而不是h(n) = h(1) * h(n-1) +... 呢?
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。