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
[balabala] 递归函数中当beg > end时要往结果中添加一个null元素,不然上一层for循环始终不能执行,从而导致最终结果总为空。
被yb君指正,发现自己对各算法特点并不熟悉,复习了下,关于分治下面链接非常好
http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741370.html
分治法所能解决的问题一般具有以下几个特征:
1) 该问题的规模缩小到一定的程度就可以容易地解决
2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。
3) 利用该问题分解出的子问题的解可以合并为该问题的解;
4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。
第一条特征是绝大多数问题都可以满足的,因为问题的计算复杂性一般是随着问题规模的增加而增加;
第二条特征是应用分治法的前提它也是大多数问题可以满足的,此特征反映了递归思想的应用;、
第三条特征是关键,能否利用分治法完全取决于问题是否具有第三条特征,如果具备了第一条和第二条特征,而不具备第三条特征,则可以考虑用贪心法或动态规划法。
第四条特征涉及到分治法的效率,如果各子问题是不独立的则分治法要做许多不必要的工作,重复地解公共的子问题,此时虽然可用分治法,但一般用动态规划法较好。
/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; left = null; right = null; } * } */ public class Solution { public List generateTrees(int n) { ArrayList trees = new ArrayList(); recur(1, n, trees); return trees; } public void recur(int beg, int end, ArrayList trees) { if (beg > end) { trees.add(null); return; } else if (beg == end) { TreeNode tree = new TreeNode(beg); trees.add(tree); return; } for (int root = beg; root leftSubTrees = new ArrayList(); recur(beg, root - 1, leftSubTrees); ArrayList rightSubTrees = new ArrayList(); recur(root + 1, end, rightSubTrees); for (TreeNode left : leftSubTrees) { for (TreeNode right : rightSubTrees) { TreeNode treeRoot = new TreeNode(root); treeRoot.left = left; treeRoot.right = right; trees.add(treeRoot); } } } } }
相关推荐
javascript js_leetcode题解之95-unique-binary-search-trees-ii.js
javascript js_leetcode题解之96-unique-binary-search-trees.js
python python_leetcode题解之095_Unique_Binary_Search_Trees_II
c语言基础 c语言_leetcode题解之0095_unique_binary_search_trees_ii.zip
python python_leetcode题解之096_Unique_Binary_Search_Trees
c语言基础 c语言_leetcode题解之0096_unique_binary_search_trees.zip
- **唯一二叉搜索树(Unique Binary Search Trees)**: 不同的二叉搜索树的数量。 #### 位操作技巧 - **更新位(Update Bits)**: 在一个整数中更新若干位。 - **快速幂(Fast Power)**: 快速计算一个数的幂。 #### ...
leetcode添加元素使和等于 Leetcode-tree 94题 Binary Tree Inorder Traversal 对于树的问题,大多数我们都会使用递归的方法。原因是树的左子树也是树,右子树也是树,使用递归的方法最简单快捷。这道题是需要我们用...
137 | [Single Number II](https://leetcode.com/problems/single-number-ii/) | [C++](./C++/single-number-ii.cpp) [Python](./Python/single-number-ii.py) | _O(n)_ | _O(1)_ | Medium ||| 190 | [Reverse Bits]...
96.unique-binary-search-trees.cpp [TODO] 70. 爬楼梯.cpp [TODO] 746. min-cost-climbing-stairs.cpp 第 4 天: [待办事项] leetcode/1143。 最长公共子序列.cpp 第 5 天: [待办事项] leetcode/221。 最大平方....
【描述】中的"Unique Binary Search Trees"提到了一种特定的LeetCode问题,即"唯一的二叉搜索树"。这个问题要求计算给定整数n的所有不同结构的二叉搜索树的数量。二叉搜索树是一种特殊的二叉树,其中每个节点的左...
leetcode 答案 LeetCodeSolution This is the solutions set of the LeetCode Website's problems. Some Information Language :Java Website url : Why to Do : Everyday Code is interesting Notes Climbing ...
leetcode python 001 Algorithm 用python和java解决了Leetcode上部分问题,另外还有对常规算法和机器学习算法的一些实现,例如用遗传算法解物流配送问题。 Leetcode问题 serial number Title Solution Add date ...
- Unique Binary Search Trees:不同的二叉搜索树的个数。 - Happy Number:一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为1,也可能是无限...