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

这次的题目要求是得到所有的树。

我的思路:

用f[n]存储1-n的所有方法的根节点

则 f[n+1] = 1作为根,f[0]做左子树,f[n]所有节点都加1做右子树  +  2作为根,f[1]做左子树,f[n - 1]所有节点都加2做右子树 +...

代码内存都没有释放,不过AC了。

#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std; // Definition for binary tree
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) {
vector<vector<TreeNode *>> ans(n + , vector<TreeNode *>());
if(n == )
{
ans[].push_back(NULL);
return ans[];
} TreeNode * root = NULL;
ans[].push_back(root);
root = new TreeNode();
ans[].push_back(root);
for(int i = ; i <= n; i++) //总数字
{
for(int j = ; j < i; j++) //小于根节点的数字个数
{
for(int l = ; l < ans[j].size(); l++) //小于根节点的组成方法数
{
for(int r = ; r < ans[i - j - ].size(); r++) //大于根节点的组成方法数
{
TreeNode * root = new TreeNode(j + );
root->left = ans[j][l];
root->right = add(ans[i - j - ][r], j + ); //大于根节点的需要加上差值
ans[i].push_back(root);
}
}
}
} return ans[n];
} TreeNode * add(TreeNode * root, int Num)
{
if(root == NULL)
{
return root;
}
TreeNode * T = new TreeNode(root->val + Num);
T->left = add(root->left, Num);
T->right = add(root->right, Num); return T;
}
}; int main()
{
Solution s;
vector<TreeNode *> ans = s.generateTrees(); return ;
}

看别人的思路,把建立子树分为从数字start-end,直接递归求解,不需要像我的那样每次还要把右子树遍历增加值

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

【leetcode】 Unique Binary Search Trees II (middle)☆的更多相关文章

  1. 【leetcode】Unique Binary Search Trees II

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

  2. 【LeetCode】Unique Binary Search Trees II 异构二叉查找树II

    本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/p/4048209.html 原题: Given n, generate all struc ...

  3. 【leetcode】Unique Binary Search Trees

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

  4. 【Leetcode】【Medium】Unique Binary Search Trees II

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

  5. 【leetcode】Unique Binary Search Trees (#96)

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...

  6. 【题解】【BST】【Leetcode】Unique Binary Search Trees

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...

  7. 【Leetcod】Unique Binary Search Trees II

    给定结点数n,结点值为1,2,...,n,求由这些结点可以构成的所有二叉查找树. Given n, generate all structurally unique BST's (binary sea ...

  8. 【树】Unique Binary Search Trees II

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

  9. 【leetcode】 Unique Binary Search Trees (middle)☆

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

随机推荐

  1. Web渗透测试使用Kali Linux(一)渗透测试概要及环境部署

    渗透测试是利用已经发现的漏洞,采用恶意黑客的惯用手段来尝试对漏洞进行攻击. Kali Linux是BackTrack的进化版,是Linux的衍生版本,专门开发用作渗透测试,其中提供了很多的渗透测试工具 ...

  2. 基础知识系列☞C#中数组Array、ArrayList和List三者的区别

    数组() #region 数组 //初始化方式_0:先声明再赋值 ]; weekDays_0[] = "Sun"; weekDays_0[] = "Mon"; ...

  3. solr

    一.启动命令 tar -zxvf solr-.tgz cd solr-\example java -jar start.jar 默认监听8983端口 java -Djetty.port= -jar s ...

  4. MySQL也有潜规则 – Select 语句不加 Order By 如何排序?

    今天遇到一个问题,有一个 Select 语句没有加 "Order By",返回的数据是不确定的. 这种问题碰到不止几次了.追根寻底, Select 语句如果不加 "Ord ...

  5. 目前主流的Android定位有如下几种:

    1.通过GPS模块 GPS方式准确度是最高的,但是它的缺点也非常明显:1,比较耗电:2,绝大部分用户默认不开启GPS模块:3,从GPS模块启动到获取第一次定位数据,可能需要比较长的时间:4,室内几乎无 ...

  6. word文档的生成、修改、渲染、打印,使用Aspose.Words

    无需MS Word也可执行各种文档处理任务,包括文档的生成.修改.渲染.打印,文档格式转换和邮件合并等文档处理.

  7. BZOJ1932——[Shoi2007]Setstack 集合堆栈机

    1.题目大意:就是给你一个栈,有一些操作,向栈加入空集,把栈顶的元素复制一遍再加入栈,求栈顶两元素的并集,交集 还有栈的第一个元素和栈顶(将栈顶压缩成一个元素) 2.分析:这个其实不是用hash做的, ...

  8. 客户端安全-csrf

    1.需求 理解并掌握CSRF攻击和防御 2.csrf的产生 盗个图说明(http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html) B伪 ...

  9. ios10 UNNtificationRequest UNUserNotificationCenter的应用 推送之本地推送

    iOS10 已经 "deprected" 我们的UILocalNotification 采用了全新的UNUserNotificationCenter; 1 首先,你需要引进< ...

  10. r-cnn学习系列(三):从r-cnn到faster r-cnn

    把r-cnn系列总结下,让整个流程更清晰. 整个系列是从r-cnn至spp-net到fast r-cnn再到faster r-cnn.  RCNN 输入图像,使用selective search来构造 ...