Unique Binary Search Trees II
Question:
思路
这道题, 看了答案之后感觉还行, 但是要是自己做肯定不太能想出来这种思路。
经典dfs的思路, 然后backtracking的时候合并, 其实是有点儿像merge sort的思路的
总的来说因为for loop 和 recursion一起运用, 所以比较难理解.
所以这个题呢,主要目标就是让每个node 都当一次root. 然后再往下分, 然后往下分之后呢 还可以选择让subtree的每个node 都当一次root. 接着就一直分一直分. 最后没种可能的binary tree形式都走到过.
对于每一个 recursion呢 返回当前所有能构成的subtree, 接着在parent那一级组合. 有点divid and conquer那个感觉
code
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
List<TreeNode> ans;
public List<TreeNode> generateTrees(int n) {
if(n <= 0){
return new ArrayList<>();
}
return backtrack(1, n);
}
public List<TreeNode> backtrack(int start, int end){
List<TreeNode> subtrees = new ArrayList<>();
if(start > end) {
subtrees.add(null);
return subtrees;
}
for(int i = start; i <= end; ++i){
List<TreeNode> leftSubTree = backtrack(start, i-1);
List<TreeNode> rightSubTree = backtrack(i+1, end);
for(TreeNode left: leftSubTree){
for(TreeNode right: rightSubTree){
TreeNode root = new TreeNode(i);
root.left = left;
root.right = right;
subtrees.add(root);
}
}
}
return subtrees;
}
}