本文原题: 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) +... 呢?

最新文章

  1. In-Memory:在内存中创建临时表和表变量
  2. 学习maple
  3. sqlserver删除所有表(表结构和数据)
  4. Android ViewPager再探:增加滑动指示条
  5. ThinkPhp 中Action控制器中动态改变自动完成规则(使用setProperty)
  6. Scrambled Polygon---poj2007(利用叉积排序)
  7. VIM_插件
  8. Windows套接字Socket函数
  9. 禁用USB存储设备(不重启)
  10. action中实现对批量文件上传的封装
  11. 从零开始的JS生活(一)——JS简介、变量及基本结构
  12. Ansible系列(三):YAML语法和playbook写法
  13. OV摄像头SCCB通信协议
  14. CSS学习笔记1:基础知识
  15. ubuntu下adb的使用以及开启黑域
  16. Django中使用Celery,定制应用程序中定义的shared_task未在定期任务管理页面的注册任务中显示
  17. eclipse开发go语言入门案例
  18. vs2015 cmd.exe已退出 代码为1
  19. Angular常用语句
  20. install diagnostic_updater

热门文章

  1. bzoj1093: [ZJOI2007]最大半连通子图 scc缩点+dag上dp
  2. Lua学习笔记2. lua变量和 循环
  3. UVA-1623 Enter The Dragon (贪心)
  4. word2016_添加标题和目录
  5. JS中,如何判断一个数是不是小数?如果是小数,如何判断它是几位小数??
  6. Qt界面(控件)相关设计
  7. Python 读取window下UTF-8-BOM 文件
  8. C#中使用GUID
  9. LeetCode OJ:Regular Expression Matching(正则表达式匹配)
  10. C++(笔记)浅析vector容器的实例