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
confused what "{1,#,2,3}"
means? > read more on how binary tree is serialized on OJ.
OJ's Binary Tree Serialization:
The serialization of a binary tree follows a level order traversal, where '#' signifies a path terminator where no node exists below.
Here's an example:
1 / \ 2 3 / 4 \ 5
The above binary tree is serialized as "{1,2,3,#,#,4,#,#,5}"
.
【抛砖】
这是卡特兰数的一种应用,采用动态规划:
1.从start到end,逐个取出一个rootVal作为根节点(n阶原问题)
2.以根rootVal为界划分为左右子树,并指向左右子树(n-1阶子问题)
3.反复递归:
public List<TreeNode> generateTrees(int n) {
if (n <= 0) return new ArrayList<TreeNode>();
return generateSubTree(1, n);
}
public ArrayList<TreeNode> generateSubTree(int start, int end) {
ArrayList<TreeNode> result = new ArrayList<TreeNode>();
if (start > end) {
result.add(null);
return result;
}
for (int rootVal = start; rootVal <= end; rootVal++)
for (TreeNode leftSubTreeRoot : generateSubTree(start, rootVal - 1))
for (TreeNode rightSubTreeRoot : generateSubTree(rootVal + 1, end)) {
TreeNode root = new TreeNode(rootVal);
root.left = leftSubTreeRoot;
root.right = rightSubTreeRoot;
result.add(root);
}
return result;
}
9 / 9
test cases passed. Runtime: 4 ms Your runtime beats 5.97% of javasubmissions.
欢迎优化!