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.
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.
欢迎优化!