Leetcode---Unique Binary Search Trees II

来源:互联网 发布:阿里云主机80端口打开 编辑:程序博客网 时间:2024/06/08 00:56

Given n, generate all structurally unique BST's (binary search trees) that store values 1...n.

For example,
Given n = 3, your program should return all 5 unique BST's shown below.

   1         3     3      2      1    \       /     /      / \      \     3     2     1      1   3      2    /     /       \                 \   2     1         2                 3


首先可以联想到卡特兰数。当我们从1到n选择根节点时,有不同的树可以生成,可以推出如下结构:
对于n个节点,可以生成的二叉排序树的个数为f(n),则f(n)=f(0)*f(n-1)+f(1)*f(n-2)+...+f(n-1)*f(0)
设m=n-1, 公式就是f(m+1)=西格玛 f(i)*f(m-i), i从0到m, m>=0, 为了使公式成立,需要f(0)=1
所以这是典型的卡特兰数,可以利用这一点方便的求得所能生成的BST的个数。

其实从1到n的数生成的BST的个数和n个节点生成的二叉树的个数是完全一样的,都是卡特兰数。直观上可以这么理解:n个节点生成的每种二叉树,都可以把1到n的数字填进去,所以是一一对应的。

原问题是求所有生成的BST,那可以利用递归求解,关键是如何在递归函数中传递数据。一个方法是利用vector作为返回值,程序如下,也很短:

  1. class Solution {
  2. public:
  3.     vector<TreeNode *> generateTrees(int n) {
  4.         return f(1,n);
  5.     }
  6.     vector<TreeNode *> f(int start, int end){
  7.         vector<TreeNode *> result;
  8.         if(start>end){
  9.             result.push_back(NULL);
  10.             return result;
  11.         }
  12.         for(int k=start;k<=end;k++){
  13.             vector<TreeNode *> left=f(start,k-1);
  14.             vector<TreeNode *> right=f(k+1,end);
  15.             for(int i=0;i<left.size();i++){
  16.                 for(int j=0;j<right.size();j++){
  17.                     TreeNode * root=new TreeNode(k);
  18.                     root->left=left[i];
  19.                     root->right=right[j];
  20.                     result.push_back(root);
  21.                 }
  22.             }
  23.         }
  24.         return result;
  25.     }
  26. };


<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(1) | 评论(0) | 转发(0) |
0

上一篇:Leetcode---Interleaving String

下一篇:Leetcode---Valid Palindrome

相关热门文章
  • 大量野生菌上市
  • 目前已经完成对接项目56项...
  • 一年就卖了1300块钱
  • 三是要严格实施引种隔离...
  •   会议期间
  • test123
  • 编写安全代码——小心有符号数...
  • 使用openssl api进行加密解密...
  • 一段自己打印自己的c程序...
  • sql relay的c++接口
  • 谁能够帮我解决LINUX 2.6 10...
  • 现在的博客积分不会更新了吗?...
  • shell怎么读取网页内容...
  • ssh等待连接的超时问题...
  • curl: (56) Recv failure: Con...
给主人留下些什么吧!~~
原创粉丝点击