leetcode 95 Unique Binary Search Trees II ----- java
Given an integer 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
是第96题的延伸,要求出所有可能性。
刚开始写了一个回溯法,但是由于没有办法在TreeNode中重写equals,导致需要重写的东西很多(主要这样做的话,一个一个添加TreeNode。会出现重复的情况),也就导致了时间很长。一百多ms。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
List list = new ArrayList<TreeNode>();
public List<TreeNode> generateTrees(int n) { if( n == 0)
return list;
int[] pos = new int[n];
for( int i = 0;i<n;i++){
pos[i] = 1;
TreeNode root = new TreeNode(i+1);
getResult(root,pos);
pos[i] = 0;
}
return list;
} public void getResult(TreeNode root,int[] pos){ int flag = 0;
for( int i = 0;i<pos.length;i++){
if( pos[i] == 0){
addNode(root,i);
pos[i] = 1;
getResult(root,pos);
delNote(root,i);
pos[i] = 0;
flag = 1;
}
}
if( flag == 0){
TreeNode ans = getAns(root);
if( !isExist(ans) )
list.add(ans);
} }
public boolean isExist(TreeNode ans){
int size = list.size();
for( int i = 0;i<size;i++){
if( isSame((TreeNode)list.get(i),ans) )
return true;
}
return false; }
public boolean isSame(TreeNode node1,TreeNode node2){
if( node1.val != node2.val)
return false;
if( node1.left != null && node2.left != null){
if( !isSame(node1.left,node2.left) )
return false;
}else if( node1.left == null && node2.left == null)
;
else
return false;
if( node1.right != null && node2.right != null){
if( !isSame(node1.right,node2.right) )
return false;
}else if( node1.right == null && node2.right == null )
;
else
return false;
return true;
} public TreeNode getAns(TreeNode root){ TreeNode ans = new TreeNode(root.val);
if( root.left != null )
ans.left = getAns(root.left);
if( root.right != null)
ans.right = getAns(root.right);
return ans;
} public void addNode(TreeNode root,int i ){
while( true){
if( i+1 > root.val ){
if( root.right == null){
root.right = new TreeNode(i+1);
return ;
}else
root = root.right;
}else{
if( root.left == null){
root.left = new TreeNode(i+1);
return ;
}else
root = root.left;
}
}
}
public void delNote(TreeNode root,int i){
while( true){
if( i+1 > root.val ){
if( i+1 == root.right.val ){
root.right = null;
return ;
}else
root = root.right;
}else{
if( i+1 == root.left.val ){
root.left = null;
return ;
}else
root = root.left;
}
}
} }
然后看了网上的解答,有两个我认为还不错,一个是根据树的结构来回溯,效率很高,不会出现重复,
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<TreeNode> generateTrees(int n) { if(n == 0) {
return new ArrayList<TreeNode>();
} return gen(1, n);
} List<TreeNode> gen(int start, int end) {
ArrayList<TreeNode> heads = new ArrayList<TreeNode>();
if(start > end) {
heads.add(null);
return heads;
} for(int i = start; i <= end; i++) { List<TreeNode> lefts = gen(start, i - 1);
List<TreeNode> rights = gen(i + 1, end); for(TreeNode left : lefts) {
for(TreeNode right : rights) {
TreeNode head = new TreeNode(i);
head.left = left;
head.right = right;
heads.add(head);
}
}
} return heads; }
}
还有一种动态规划其实也就是第二种方法的改良。
public static List<TreeNode> generateTrees(int n) {
List<TreeNode>[] result = new List[n + 1];
result[0] = new ArrayList<TreeNode>();
if (n == 0) {
return result[0];
}
result[0].add(null);
for (int len = 1; len <= n; len++) {
result[len] = new ArrayList<TreeNode>();
for (int j = 0; j < len; j++) {
for (TreeNode nodeL : result[j]) {
for (TreeNode nodeR : result[len - j - 1]) {
TreeNode node = new TreeNode(j + 1);
node.left = nodeL;
node.right = clone(nodeR, j + 1);
result[len].add(node);
}
}
}
}
return result[n];
}
private static TreeNode clone(TreeNode n, int offset) {
if (n == null) {
return null;
}
TreeNode node = new TreeNode(n.val + offset);
node.left = clone(n.left, offset);
node.right = clone(n.right, offset);
return node;
}
leetcode 95 Unique Binary Search Trees II ----- java的更多相关文章
- [LeetCode] 95. Unique Binary Search Trees II(给定一个数字n,返回所有二叉搜索树) ☆☆☆
Unique Binary Search Trees II leetcode java [LeetCode]Unique Binary Search Trees II 异构二叉查找树II Unique ...
- [leetcode]95. Unique Binary Search Trees II给定节点形成不同BST的集合
Given an integer n, generate all structurally unique BST's (binary search trees) that store values 1 ...
- [LeetCode] 95. Unique Binary Search Trees II 唯一二叉搜索树 II
Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...
- [LeetCode] 95. Unique Binary Search Trees II 独一无二的二叉搜索树之二
Given an integer n, generate all structurally unique BST's (binary search trees) that store values 1 ...
- leetCode 95.Unique Binary Search Trees II (唯一二叉搜索树) 解题思路和方法
Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...
- [leetcode]95 Unique Binary Search Trees II (Medium)
原题 字母题添加链接描述 一开始完全没有思路.. 百度看了别人的思路,对于这种递归构造的题目还是不熟,得多做做了. 这个题目难在构造出来.一般构造树都需要递归. 从1–n中任意选择一个数当做根节点,所 ...
- LeetCode 95. Unique Binary Search Trees II 动态演示
比如输入为n, 这道题目就是让返回由1,2,... n的组成的所有二叉排序树,每个树都必须包含这n个数 这是二叉树的排列组合的题目.排列组合经常用DFS来解决. 这道题比如输入为3,也就是求start ...
- 【LeetCode】95. Unique Binary Search Trees II 解题报告(Python)
[LeetCode]95. Unique Binary Search Trees II 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzh ...
- leetcode 96. Unique Binary Search Trees 、95. Unique Binary Search Trees II 、241. Different Ways to Add Parentheses
96. Unique Binary Search Trees https://www.cnblogs.com/grandyang/p/4299608.html 3由dp[1]*dp[1].dp[0]* ...
随机推荐
- batch insert 1 million datas into mysql
最近尝试插入1百万条数据进db,以mysql为例. 1. 顺序insert 先写了个无脑的for循环作为base-line,插1万条耗时1m53s,根本不敢插1百万. foreach(var stud ...
- python操作二进制文件
有的时候需要用python处理二进制数据,比如,存取文件,socket操作时.这时候,可以使用python的struct模块来完成.可以用 struct来处理c语言中的结构体. struct模块中最重 ...
- C++-const_cast只能用于指针和引用,对象的const到非const可以用static_cast
Static_cast可以对对象也可以对指针也可以对引用,但是const_cast只可以对指针和引用使用,后者不可以对对象用,如果你要把一个const值转化为非const值只能用隐式执行或通过使用st ...
- JavaScript中Date的一些细节
对于开发人员来说,Date有时候或许会很重要,我们可以通过new Date()来创建一个日期对象.例如: var start = new Date(), //获取当前时间 today = new Da ...
- SharePoint表单和工作流 - Nintex篇(六)
博客地址 http://blog.csdn.net/foxdave 接上篇点击打开链接 在工作流Action的配置对话框中,点击"Edit with Nintex Forms",上 ...
- php的分页查询建立分页类
创建一个分页类 <?php /** file: page.class.php 完美分页类 Page */ class Page { private $total; //数据表中总记录数 priv ...
- 计算系数(noip2011)
[问题描述]给定一个多项式(ax + by)^k,请求出多项式展开后(x^n)*(y^m)项的系数.[输入]输入文件名为 factor.in.共一行,包含 5 个整数,分别为a,b,k,n,m,每两个 ...
- fragment的一些bug
自从Android3.0引入了Fragment之后,使用Activity去嵌套一些Fragment的做法也变得更加流行,这确实是 Fragment带来的一些优点,比如说:Fragment可以使你能够将 ...
- 《day16_多线程细节_Eclipse使用》
多线程的一些细节: 1,面试题:sleep方法和wait方法异同点是什么? 相同点:可以让线程处于冻结状态. 不同点: 1, sleep必须指定时间. wait可以指定时间,也可以不指定时间. 2, ...
- Qt调用WebService
从网上查找Qt调用WebService的方案,需要下载三方的类库,而且需要使用好几个控制台命令,才能生成代理客户端类.因为只是简单的测试,没有采用这种方式,直接使用HTTP的Get获取网站内容,也非常 ...