题目描述
给定一个值n,请生成所有的存储值1...n.的二叉搜索树(BST)的结构
例如:
给定n=3,你的程序应该给出下面五种不同的二叉搜索树(BST)
1 3 3 2 1↵ / / / ↵ 3 2 1 1 3 2↵ / / ↵ 2 1 2 3
如果你不清楚“{1,#,2,3}"的含义的话,请继续阅读
我们用如下方法将二叉树序列化:
二叉树的序列化遵循层序遍历的原则,”#“代表该位置是一条路径的终结,下面不再存在结点。
例如:
1↵ / ↵ 2 3↵ /↵ 4↵ ↵ 5
上述的二叉树序列化的结果是:"{1,2,3,#,#,4,#,#,5}".
//二叉搜索树(二叉排序树):左<根<右
public ArrayList<TreeNode> generateTrees (int n) {
return getTrees(1,n);
}
//生成[min,max]范围内的随机数
public ArrayList<TreeNode> getTrees(int min,int max){
final ArrayList<TreeNode> trees = new ArrayList<TreeNode>();//存放二叉搜索树集合
if(min>max){//空树
trees.add(null);
return trees;
}
if(min==max){//只有根节点,值为min
TreeNode r = new TreeNode(min);
trees.add(r);
return trees;
}
for(int i=min;i<=max;i++){//对于根节点取[min,max]范围内不同的值时,可能生成的二叉搜索树
ArrayList<TreeNode> left = getTrees(min,i-1); //当根节点为i时,可生成不同左子树的个数
ArrayList<TreeNode> right = getTrees(i+1,max);//当根节点为i时,可生成不同右子树的个数
for(int l=0;l<left.size();l++){//针对不同的情况,一共可生成不同 BST的个数
for(int r=0;r<right.size();r++){
TreeNode root = new TreeNode(i);
root.left = left.get(l);
root.right = right.get(r);
trees.add(root);
}//for
}//for
}//for
return trees;
}