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]* ...
随机推荐
- main函数参数的使用
int main(int argc, char * argv[]) argc: argument count argv:argument vector 其中, char * argv[] 指针数组 c ...
- java中利用JFrame创建窗体 【转】
1. 一个简单的swing public class Test(){ public static void main(String[] args){ JFrame frame = new JFrame ...
- MicroPython开发板TPYBoard关于USB-HID的应用
USB-HID是Human Interface Device的缩写,属于人机交互操作的设备,如USB鼠标,USB键盘,USB游戏操纵杆,USB触摸板,USB轨迹球.电话拨号设备.VCR遥控等等设备. ...
- vi notes
x = wqqq!, quit without save. movej,h,k,l^ or 0: start of line$: end of line:0, start of file:$, end ...
- 《Java实验四》
//实验4--附录一代码 public class PassValueTest { //静态代码块,类一加载就执行的部分. //所以运行这个程序会输出 class loding static { Sy ...
- 块状元素和内联元素 【inline block】
// 9) { colorRandom += colorArray[randomV - 10]; } else { colorRandom += randomV; } } currentEle.css ...
- poj2184 背包
//Accepted 1492 KB 110 ms //背包 //把si看成weight,Fi看成value,这可以表示成当dp[j]=max(dp[j-weight[i]]+value[i]) // ...
- 如何为Eclipse设置代理
看图,不解释:
- Python学习路程day3
set集合 set是一个无序且不重复的元素集合,访问速度快,天生解决重复问题 s1 = set() s1.add('luo') s2 = set (['luo','wu','wei','ling' ...
- 封装定制的Kali Live ISO
打造专属的Kali ISO – 简介 封装定制的Kali ISO很简单,很有趣,很有意义.你可以用Debian的live-build脚本对Kali ISO进行全面的配置.这些脚本以一系列配置文件的方式 ...