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
package niuke.day1;
import java.util.ArrayList;
public class Unique_binary_search_trees_ii {
public static void main(String[] args) {
generateTrees(3);
}
public static ArrayList<TreeNode> generateTrees(int n) {
return generateTrees1( 1, n);
}
private static ArrayList<TreeNode> generateTrees1(int low, int high) {
// TODO Auto-generated method stub
ArrayList<TreeNode> res = new ArrayList<>();
if(low > high) {
res.add(null); //当下界大于上界时,就把一个空节点返回给res,此时res的长度为1
return res;
}
for(int i = low; i <= high ; i ++) { //从下界开始,一直到上界,依次为根节点来计算
//这个递归最好按照动态规划从下到上的思维来想,当i为根节点,左边为从low到i-1,右边为从i+1到high。
//当low和high的数值一样的时候,left和right的长度都为1,里面都存着null
//别忘了res是每一次调用的时候都在重新创建,并不是全局变量,但是所有的循环都在这个res创建的下面,所有的情况都会加到res中,三个for循环中包含的所有情况
ArrayList<TreeNode> left = generateTrees1(low , i - 1);
ArrayList<TreeNode> right = generateTrees1(i + 1, high);
//left中存着左子树的所有情况,right中存着右子树中所有的情况,两个for循环实现了左右两边子树的重新组合
for(int j = 0 ; j < left.size() ; j ++) {
for(int k = 0 ; k < right.size() ; k ++) {
TreeNode t1 = new TreeNode(i);
t1.left = left.get(j);
t1.right = right.get(k);
res.add(t1);
}
}
}
return res;
}
}