您的位置:首页 > 产品设计 > UI/UE

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.
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);

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java leetcode 动态规划