题目:

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(1, 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-1);vector<TreeNode*> right = Solution::generateBST(i+1,max);for ( size_t l = 0; l < left.size(); ++l ){for ( size_t r = 0; 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(1, 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-1);vector<TreeNode*> r = Solution::generate(i+1, end);for ( int j=0; j<l.size(); ++j ){for ( int k=0; k<r.size(); ++k ){TreeNode* root = new TreeNode(i);root->left = l[j];root->right = r[k];ret.push_back(root);}}}return ret;}
};

转载于:https://www.cnblogs.com/xbf9xbf/p/4508109.html

【Unique Binary Search Trees II】cpp相关推荐

  1. 【重点 递归构造二叉树】LeetCode 95. Unique Binary Search Trees II

    LeetCode 95. Unique Binary Search Trees II 本博客转载自:[1]https://segmentfault.com/a/1190000007443961 [2] ...

  2. leetcode 95. Unique Binary Search Trees II | 96. Unique Binary Search Trees

    95. Unique Binary Search Trees II https://leetcode.com/problems/unique-binary-search-trees-ii/ 题解 题是 ...

  3. Unique Binary Search Trees II -- LeetCode

    原题链接:  http://oj.leetcode.com/problems/unique-binary-search-trees-ii/   这道题是求解所有可行的二叉查找树,从 Unique Bi ...

  4. LeetCode Unique Binary Search Trees II(递归或者dp)

    问题:给出一个正整数,要求构造由1到n组成的所有的二叉搜索树 思路: 1.递归法 在求从1到n的二叉搜索树时,枚举中间值i(1到n),求[1,i-1]和[i+1,n]分别构成的二叉搜索树,然后根据左右 ...

  5. leetcode算法题--Unique Binary Search Trees II

    原题链接:https://leetcode.com/problems/unique-binary-search-trees-ii/ class Solution {public:vector<T ...

  6. 95. Unique Binary Search Trees II

    分成两边, left right排列组合加到root, lo==hi就返回当前值 1 class Solution { 2 public List<TreeNode> generateTr ...

  7. 95. Unique Binary Search Trees II 不同的二叉搜索树 II

    给定一个整数 n,生成所有由 1 - n 为节点所组成的 二叉搜索树 . 示例: 输入:3 输出: [[1,null,3,2],[3,2,null,1],[3,1,null,null,2],[2,1, ...

  8. Leetcode95. Unique Binary Search Trees II不同的二叉搜索树2

    给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树. 示例: 输入: 3 输出: [   [1,null,3,2],   [3,2,null,1],   [3,1,null,nul ...

  9. 96. Unique Binary Search Trees(I 和 II)

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

最新文章

  1. 年薪百万是什么感觉?
  2. java 数组 反射_java数组的反射
  3. #数据集#:并发脑电图、心电图和多剂量经颅电刺激行为的数据集
  4. android小程序源代码_我从 Android 转到微信小程序的思考
  5. 怎么找出消耗 CPU 的罪魁祸首?!
  6. Spark入门(十二)之最值
  7. SharePoint 2013 入门教程--系列文章
  8. keras简介(一)
  9. Ubuntu18.04-albert编译安装记录
  10. teamview linux命令行安装参数
  11. 中债估值 收益率_收债
  12. L1-039 古风排版 (20 分)(二维数组)
  13. 计算机知识二级竞赛流程,计算机知识竞赛比赛规则及流程
  14. Ubuntu 20.04安装字体
  15. iOS中PCH文件的使用
  16. C语言 近似求PI
  17. 微信新升级?这2个功能是你们期盼的吗?
  18. c语言中循环体表达式,C语言的循环语句
  19. #一首国庆生活写照#
  20. 基于SSM的电影票预订系统 JAVA MYSQL

热门文章

  1. exchange 2013设置分层通讯簿(HAB)
  2. java-结合c3p0封装的db 事务 类
  3. Java面试题-javaweb篇七
  4. PDF文档怎么提取其中一页
  5. DDoS***、CC***的***方式和防御方法
  6. ES6新增的let与const
  7. Flume NG 学习笔记(八)Interceptors(拦截器)测试
  8. linux-常用命令-iostatvmstat
  9. docke跨主机通信之gre隧道
  10. 浅谈loadrunner中pacing设置