Given an integer n, generate all structurally unique BST's (binary search trees) that store values 1...n.
这题是NP问题的套路,for循环中调用递归。在NQUEENS中有总结。
我感觉这题思维还挺难的,套用一般的DFS套路还需要想一想,就是树怎么拼接起来的。跟前面一题一样,
我总是会感觉在dfs中先调用递归函数,后面的东西会执行不到,其实是不对的,可以看之前提的问题。
public List<TreeNode> generateTrees(int n) {
if(n == 0 ) return new ArrayList<>();
//以root=1开始,root=n结束
return dfs(1, n);
}
private List<TreeNode> dfs(int left, int right) {
List<TreeNode> res = new ArrayList<>();
if (left > right) {
res.add(null);
return res;
}
for (int i = left; i <= right; i++) {
//左子树由[left,i-1]的节点构成,右子树由[i+1,right]的节点构成
List<TreeNode> leftSide = dfs(left, i - 1);
List<TreeNode> rightSide = dfs(i + 1, right);
for (TreeNode lt : leftSide)
for (TreeNode rt : rightSide) {
TreeNode root = new TreeNode(i);
root.left = lt;
root.right = rt;
res.add(root);
}
}
return res;
}
构造树时两边要遍历所有左右的匹配,然后接到根上面。从两个for循环构造树的过程中可以体会到为什么卡特兰数是要相乘的。
网友评论