题目:

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

代码:

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<TreeNode*> generateTrees(int n) {
return Solution::generateBST(, n);
}
static vector<TreeNode*> generateBST(int min, int max)
{
vector<TreeNode*> ret;
if ( min>max ) { ret.push_back(NULL); return ret; }
for ( int i = min; i<=max; ++i )
{
vector<TreeNode*> left = Solution::generateBST(min, i-);
vector<TreeNode*> right = Solution::generateBST(i+,max);
for ( size_t l = ; l < left.size(); ++l )
{
for ( size_t r = ; r < right.size(); ++r )
{
TreeNode *root = new TreeNode(i);
root->left = left[l];
root->right = right[r];
ret.push_back(root);
}
}
}
return ret;
}
};

tips:

直接学习大神的代码

http://bangbingsyb.blogspot.sg/2014/11/leetcode-unique-binary-search-trees-i-ii.html

一开始一直有一个疑问,如果min==max的时候(即只有一个元素的时候)能构造一个新的节点返回么?

肯定是可以的。因为这时left返回的是含有一个NULL的vector,right返回的是含有一个NULL的vector;两个vector的长度都是1,因此可以构造出这个新的点。

===================================================

第二次过这道题,没啥可说的,再学一遍前人的代码。没啥可说的,递归确实很漂亮。

这里的精髓在于,即使是begin>end这种情况,也返回一个长度为1的NULL点;这样做的好处是即使只有一个点传入了,l.size() 和r.szie()也都是1(虽然里面都是NULL);这样代码就很简洁了。

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<TreeNode*> generateTrees(int n)
{
return Solution::generate(, n);
}
static vector<TreeNode*> generate(int begin, int end)
{
vector<TreeNode* > ret;
if ( begin>end )
{
ret.push_back(NULL);
return ret;
}
for ( int i=begin; i<=end; ++i )
{
vector<TreeNode*> l = Solution::generate(begin, i-);
vector<TreeNode*> r = Solution::generate(i+, end);
for ( int j=; j<l.size(); ++j )
{
for ( int k=; k<r.size(); ++k )
{
TreeNode* root = new TreeNode(i);
root->left = l[j];
root->right = r[k];
ret.push_back(root);
}
}
}
return ret;
}
};

【Unique Binary Search Trees II】cpp的更多相关文章

  1. 【二叉查找树】02不同的二叉查找树个数II【Unique Binary Search Trees II】

    提到二叉查找树,就得想到二叉查找树的递归定义, 左子树的节点值都小于根节点,右子树的节点值都大于根节点. +++++++++++++++++++++++++++++++++++++++++++++++ ...

  2. 【LeetCode】95. Unique Binary Search Trees II 解题报告(Python)

    [LeetCode]95. Unique Binary Search Trees II 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzh ...

  3. 【LeetCode】95. Unique Binary Search Trees II

    Unique Binary Search Trees II Given n, generate all structurally unique BST's (binary search trees) ...

  4. 【leetcode】Unique Binary Search Trees II

    Unique Binary Search Trees II Given n, generate all structurally unique BST's (binary search trees) ...

  5. [LeetCode] 95. Unique Binary Search Trees II(给定一个数字n,返回所有二叉搜索树) ☆☆☆

    Unique Binary Search Trees II leetcode java [LeetCode]Unique Binary Search Trees II 异构二叉查找树II Unique ...

  6. 41. Unique Binary Search Trees && Unique Binary Search Trees II

    Unique Binary Search Trees Given n, how many structurally unique BST's (binary search trees) that st ...

  7. LeetCode: Unique Binary Search Trees II 解题报告

    Unique Binary Search Trees II Given n, generate all structurally unique BST's (binary search trees) ...

  8. Unique Binary Search Trees,Unique Binary Search Trees II

    Unique Binary Search Trees Total Accepted: 69271 Total Submissions: 191174 Difficulty: Medium Given  ...

  9. LeetCode解题报告—— Reverse Linked List II & Restore IP Addresses & Unique Binary Search Trees II

    1. Reverse Linked List II Reverse a linked list from position m to n. Do it in-place and in one-pass ...

随机推荐

  1. MVC开发Markdown编辑器(2)

    MVC开发Markdown编辑器(2) MVC Markdown 实时预览 我希望实现一个在线实时预览的Markdown编辑器,左边是编辑处,右边是实时预览界面. 准备工作 引入相关js和css 这里 ...

  2. 在Eclipse中查看JDK类库的源代码

    http://blog.csdn.net/a81895898/article/details/8486802 在Eclipse中查看JDK类库的源代码!!! 设置: 1.点 “window”-> ...

  3. PL/SQL Developer中文注释乱码的解决办法

    1.检查服务器编码: 执行SQL语法: select * from v$nls_parameters; 2.设置本地客户端编码: 进入 我的电脑,属性,高级,环境变量,添加2项:LANG=zh_CN. ...

  4. SMTP sendMail 失败解决办法

    If you are seeing messages like this in your message log when running a process through the process ...

  5. 使用mitmf 来绕过HSTS站点抓取登陆明文

    使用mitmf 来绕过HSTS站点抓取登陆明文 HSTS简介 HSTS是HTTP Strict Transport Security的缩写,即:"HTTP严格安全传输".当浏览器第 ...

  6. 内存分配函数malloc、realloc、calloc、_alloca

    1.内存分配函数_alloca.malloc.realloc.calloc: _alloca 函数原型void * __cdecl _alloca(size_t); 头文件:malloc.h _all ...

  7. 010-python基础-数据类型-字符串操作

    1.移除空白 username.strip() 2.分割 names = "alex,jack,rain" names_1 = names.split(",") ...

  8. LC.exe exited with code -1

    昨天从win8.1升级到win10之后, 一切还算顺利, 就是升级时间比较长. 但是快下班的时候 遇到一个问题, 是之前在win8.1上没遇到的, 首先代码win8.1 vs2013 上跑的时候一切正 ...

  9. sizeclass

    横竖9种组合,代表所有大小屏幕,在storyboard中可以把contrans与不同组合绑定,也就是说,可能横向有多一个约束,纵向就没了... 实现不同屏幕不同约束,这应该是sizeclass 的存在 ...

  10. Moses与IRSTLM共同编译失败的解决方案:fatal error: dictionary.h no such file or 目录

    已经解决: 错误原因在于始终没用又用已经编译安装过的irstlm而是一直用那个原文件夹造成的,而这里Manual似乎也写错了,manual里有很强的误导性: