[LeetCode系列]卡特兰数(Catalan Number) 在求解独特二叉搜寻树(Unique Binary Search Tree)中的应用分析
2024-10-16 02:08:46
本文原题: 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++代码:
class Solution {
public:
int numTrees(int n) {
if (n < ) return ;
vector<int> h(n+, );
h[] = ; for(int i = ; i <= n; i++)
for (int j = ; j < i; j++)
h[i] += h[j] * h[i-j-]; return h[n];
}
};
对于此代码本人有一个疑惑, 就是为何h(n) = h(0) * h(n-1) +... 而不是h(n) = h(1) * h(n-1) +... 呢?
最新文章
- In-Memory:在内存中创建临时表和表变量
- 学习maple
- sqlserver删除所有表(表结构和数据)
- Android ViewPager再探:增加滑动指示条
- ThinkPhp 中Action控制器中动态改变自动完成规则(使用setProperty)
- Scrambled Polygon---poj2007(利用叉积排序)
- VIM_插件
- Windows套接字Socket函数
- 禁用USB存储设备(不重启)
- action中实现对批量文件上传的封装
- 从零开始的JS生活(一)——JS简介、变量及基本结构
- Ansible系列(三):YAML语法和playbook写法
- OV摄像头SCCB通信协议
- CSS学习笔记1:基础知识
- ubuntu下adb的使用以及开启黑域
- Django中使用Celery,定制应用程序中定义的shared_task未在定期任务管理页面的注册任务中显示
- eclipse开发go语言入门案例
- vs2015 cmd.exe已退出 代码为1
- Angular常用语句
- install diagnostic_updater
热门文章
- bzoj1093: [ZJOI2007]最大半连通子图 scc缩点+dag上dp
- Lua学习笔记2. lua变量和 循环
- UVA-1623 Enter The Dragon (贪心)
- word2016_添加标题和目录
- JS中,如何判断一个数是不是小数?如果是小数,如何判断它是几位小数??
- Qt界面(控件)相关设计
- Python 读取window下UTF-8-BOM 文件
- C#中使用GUID
- LeetCode OJ:Regular Expression Matching(正则表达式匹配)
- C++(笔记)浅析vector容器的实例