leetcode Unique Binary Search Trees II
2014-11-03 18:43
375 查看
Unique Binary Search Trees II 原题地址:
https://oj.leetcode.com/problems/unique-binary-search-trees-ii/
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.
求所有的可能。
网上有一种作法是递归,对每个可能的根,求左子树所有的可能性,再求右子树所有可能性,两个for循环列举出来,作为根下所有的可能。
public class Solution {
public List<TreeNode> generateTrees(int lo, int hi) {
List<TreeNode> tnlist = new ArrayList<TreeNode>();
if (hi < lo) {
tnlist.add(null);
return tnlist;
}
List<TreeNode> left = new ArrayList<TreeNode>();
List<TreeNode> right = new ArrayList<TreeNode>();
for (int i = lo; i <= hi; i++) {
left = generateTrees(lo, i-1);
right = generateTrees(i+1, hi);
for (int p = 0; p < left.size(); p++)
for (int q = 0; q < right.size(); q++) {
TreeNode tn = new TreeNode(i);
tn.left = left.get(p);
tn.right = right.get(q);
tnlist.add(tn);
}
}
return tnlist;
}
public List<TreeNode> generateTrees(int n) {
return generateTrees(1, n);
}
}
以下为另一种代码:
public class Solution {
TreeNode copy(TreeNode node) {
TreeNode tn = new TreeNode(node.val);
if (node.left == null) tn.left = null;
else tn.left = copy(node.left);
if (node.right == null) tn.right = null;
else tn.right = copy(node.right);
return tn;
}
TreeNode copy(TreeNode node, int plus) {
TreeNode tn = new TreeNode(node.val+plus);
if (node.left == null) tn.left = null;
else tn.left = copy(node.left, plus);
if (node.right == null) tn.right = null;
else tn.right = copy(node.right, plus);
return tn;
}
public List<TreeNode> generateTrees(int n) {
int[] num = new int[n+1];
num[0] = 1;
HashMap<Integer, List<TreeNode>> map = new HashMap<Integer, List<TreeNode>>();
for (int i = 0; i <= n; i++)
map.put(i, new ArrayList<TreeNode>());
map.get(0).add(null);
if (n == 0)
return map.get(0);
map.get(1).add(new TreeNode(1));
for (int i = 2; i <= n; i++)
for (int j = 1; j <= i; j++) {
int left = j - 1;
int right = i - j;
int l_num = map.get(left).size();
int r_num = map.get(right).size();
for (int p = 0; p < l_num; p++)
for (int q = 0; q < r_num; q++){
TreeNode tn = new TreeNode(j);
if (map.get(left).get(p) == null)
tn.left = null;
else
tn.left = copy(map.get(left).get(p));
if (map.get(right).get(q) == null)
tn.right = null;
else
tn.right = copy(map.get(right).get(q), j);
map.get(i).add(tn);
}
}
return map.get(n);
}
}
https://oj.leetcode.com/problems/unique-binary-search-trees-ii/
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
求所有的可能。
网上有一种作法是递归,对每个可能的根,求左子树所有的可能性,再求右子树所有可能性,两个for循环列举出来,作为根下所有的可能。
public class Solution {
public List<TreeNode> generateTrees(int lo, int hi) {
List<TreeNode> tnlist = new ArrayList<TreeNode>();
if (hi < lo) {
tnlist.add(null);
return tnlist;
}
List<TreeNode> left = new ArrayList<TreeNode>();
List<TreeNode> right = new ArrayList<TreeNode>();
for (int i = lo; i <= hi; i++) {
left = generateTrees(lo, i-1);
right = generateTrees(i+1, hi);
for (int p = 0; p < left.size(); p++)
for (int q = 0; q < right.size(); q++) {
TreeNode tn = new TreeNode(i);
tn.left = left.get(p);
tn.right = right.get(q);
tnlist.add(tn);
}
}
return tnlist;
}
public List<TreeNode> generateTrees(int n) {
return generateTrees(1, n);
}
}
以下为另一种代码:
public class Solution {
TreeNode copy(TreeNode node) {
TreeNode tn = new TreeNode(node.val);
if (node.left == null) tn.left = null;
else tn.left = copy(node.left);
if (node.right == null) tn.right = null;
else tn.right = copy(node.right);
return tn;
}
TreeNode copy(TreeNode node, int plus) {
TreeNode tn = new TreeNode(node.val+plus);
if (node.left == null) tn.left = null;
else tn.left = copy(node.left, plus);
if (node.right == null) tn.right = null;
else tn.right = copy(node.right, plus);
return tn;
}
public List<TreeNode> generateTrees(int n) {
int[] num = new int[n+1];
num[0] = 1;
HashMap<Integer, List<TreeNode>> map = new HashMap<Integer, List<TreeNode>>();
for (int i = 0; i <= n; i++)
map.put(i, new ArrayList<TreeNode>());
map.get(0).add(null);
if (n == 0)
return map.get(0);
map.get(1).add(new TreeNode(1));
for (int i = 2; i <= n; i++)
for (int j = 1; j <= i; j++) {
int left = j - 1;
int right = i - j;
int l_num = map.get(left).size();
int r_num = map.get(right).size();
for (int p = 0; p < l_num; p++)
for (int q = 0; q < r_num; q++){
TreeNode tn = new TreeNode(j);
if (map.get(left).get(p) == null)
tn.left = null;
else
tn.left = copy(map.get(left).get(p));
if (map.get(right).get(q) == null)
tn.right = null;
else
tn.right = copy(map.get(right).get(q), j);
map.get(i).add(tn);
}
}
return map.get(n);
}
}
相关文章推荐
- [LeetCode] Unique Binary Search Trees II
- LeetCode_DP_Unique Binary Search Trees II
- 【LeetCode】Unique Binary Search Trees II
- leetcode-java-95. Unique Binary Search Trees II
- [LeetCode] Unique Binary Search Trees II
- leetcode95~Unique Binary Search Trees II
- Java for LeetCode 095 Unique Binary Search Trees II
- LeetCode: Unique Binary Search Trees II
- leetcode -- Unique Binary Search Trees II
- Leetcode: 95. Unique Binary Search Trees II
- ***(leetcode)Unique Binary Search Trees II
- Unique Binary Search Trees II [Leetcode 解题报告]
- Unique Binary Search Trees II Leetcode Python
- leetcode Unique Binary Search Trees II
- Leetcode: Unique Binary Search Trees II
- 95. Unique Binary Search Trees II ,leetcode
- Leetcode: Unique Binary Search Trees II
- Leetcode 95. Unique Binary Search Trees II (Medium) (cpp)
- 《leetCode》:Unique Binary Search Trees II
- LeetCode095 Unique Binary Search Trees II