如果对Unique Binary Search Trees 不熟悉的,请先看我之前的post.
在这里,我们不仅要计算出不同的二分树的个数,还需要构造出所有符合要求的二分树。
回忆之前的迭代细节:
count(n) = count (0) + count(n - 1 - 0) + .. + count(i) + count(n - 1 - i) + .. + count(n - 1) * count(0)
在这里就转变成了:
要构造一个节点数为n 的树: 等于先构造它 子树 subTree(1, i - 1 ) 和 subTree(i + 1, n), 这个子树的root = node( i )
代码:
public List<TreeNode> generateTrees(int n) {
if (n <= 0) {
return new ArrayList<>();
}
return doGenerateTrees(1, n);
}
private List<TreeNode> doGenerateTrees(int begin, int end) {
List<TreeNode> store = new ArrayList<>();
if (begin > end) {
store.add(null);// attention: must add null
return store;
}
for (int i = begin; i <= end; i++) {
List<TreeNode> leftList = doGenerateTrees(begin, i - 1);
List<TreeNode> rightLIst = doGenerateTrees(i + 1, end);
for (TreeNode leftNode : leftList) {
for (TreeNode rightNode : rightLIst) {
TreeNode head = new TreeNode(i);
head.left = leftNode;
head.right = rightNode;
store.add(head);
}
}
}
return store;
}