Skip to content

Commit b217f8f

Browse files
Accepted
1 parent 12a9561 commit b217f8f

File tree

2 files changed

+141
-0
lines changed

2 files changed

+141
-0
lines changed
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/**
2+
* Created by gouthamvidyapradhan on 31/03/2017.
3+
* Accepted
4+
*/
5+
public class UniqueBinarySearchTrees
6+
{
7+
int[] dp;
8+
/**
9+
* Main method
10+
* @param args
11+
*/
12+
public static void main(String[] args) throws Exception
13+
{
14+
System.out.println(new UniqueBinarySearchTrees().numTrees(5));
15+
}
16+
17+
public int numTrees(int n)
18+
{
19+
dp = new int[n + 1];
20+
dp[0] = 1;
21+
return dp(n);
22+
}
23+
24+
private int dp(int n)
25+
{
26+
if(dp[n] != 0) return dp[n];
27+
for(int i = 1; i <= n; i ++)
28+
{
29+
dp[n] += dp(n - i) * dp(n - (n - i) - 1);
30+
}
31+
return dp[n];
32+
}
33+
}
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
import java.util.ArrayList;
2+
import java.util.List;
3+
4+
/**
5+
* Created by gouthamvidyapradhan on 31/03/2017.
6+
* Accepted
7+
*/
8+
public class UniqueBinarySearchTreesII
9+
{
10+
public static class TreeNode
11+
{
12+
int val;
13+
TreeNode left;
14+
TreeNode right;
15+
TreeNode(int x) { val = x; }
16+
}
17+
18+
private List<TreeNode>[][] dp;
19+
20+
/**
21+
* Main method
22+
* @param args
23+
* @throws Exception
24+
*/
25+
public static void main(String[] args) throws Exception
26+
{
27+
List<TreeNode> list = new UniqueBinarySearchTreesII().generateTrees(3);
28+
}
29+
30+
public List<TreeNode> generateTrees(int n)
31+
{
32+
if(n == 0) return new ArrayList<>();
33+
dp = new List[n + 1][n + 1];
34+
dp[0][0] = new ArrayList<>();
35+
for(int i = 1, j = 1; i <= n; i ++, j ++)
36+
{
37+
dp[i][j] = new ArrayList<>();
38+
dp[i][j].add(new TreeNode(i));
39+
}
40+
return dp(1, n, n);
41+
}
42+
43+
private List<TreeNode> dp(int s, int e, int n)
44+
{
45+
if(e < s) return null;
46+
if(dp[s][e] != null) return dp[s][e];
47+
List<TreeNode> result = new ArrayList<>();
48+
for(int i = s; i <= e; i ++)
49+
{
50+
List<TreeNode> left = dp(s, i - 1, n);
51+
List<TreeNode> right = dp(i + 1, e, n);
52+
List<TreeNode> temp = new ArrayList<>();
53+
if(left != null)
54+
{
55+
for(TreeNode node : left)
56+
{
57+
TreeNode root = new TreeNode(i);
58+
root.left = node;
59+
temp.add(root);
60+
}
61+
}
62+
if(right != null)
63+
{
64+
if(!temp.isEmpty())
65+
{
66+
for(TreeNode root : temp)
67+
{
68+
for(TreeNode node : right)
69+
{
70+
TreeNode newRoot = clone(root);
71+
newRoot.right = node;
72+
result.add(newRoot);
73+
}
74+
}
75+
}
76+
else
77+
{
78+
for(TreeNode node : right)
79+
{
80+
TreeNode root = new TreeNode(i);
81+
root.right = node;
82+
result.add(root);
83+
}
84+
}
85+
}
86+
else if(!temp.isEmpty())
87+
{
88+
result.addAll(temp);
89+
}
90+
}
91+
dp[s][e] = result;
92+
return result;
93+
}
94+
95+
/**
96+
* Clone treeNode
97+
* @param root rootnode
98+
* @return cloned root
99+
*/
100+
private TreeNode clone(TreeNode root)
101+
{
102+
if(root == null) return null;
103+
TreeNode newNode = new TreeNode(root.val);
104+
newNode.left = clone(root.left);
105+
newNode.right = clone(root.right);
106+
return newNode;
107+
}
108+
}

0 commit comments

Comments
 (0)