题目简介:给定整数n,生成存储值1到n的所有结构上唯一的BST(二叉搜索树)
示例:
思路:这个很明显需要使用深度查找来进行构建树,可以依次遍历一到n的每一个树,这n个数依次作为树的根节点,然后这些点的左部分就是作为该节点的左树,右半部分就是作为该节点的右子树。依次进行递归,左子树的根节点也可以构成一个集合,右子树一样,这样在依次将左子树和右子树与根节点进行拼接。注意,每一个根节点都是不一样的,最好是每次都重新建立一个根节点,不然会出现问题。
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<TreeNode> generateTrees(int n)
{
List<TreeNode> list=new ArrayList<>();
if(n==0)
return list;
return build(1,n);
}
//root为根节点,node为需要添加的节点
public List<TreeNode> build(int begin,int last)
{
List<TreeNode> list=new ArrayList<>();
if(begin>last)
{
list.add(null);
return list;
}
else if(begin==last)
{
list.add(new TreeNode(begin));
return list;
}
else
{
List<TreeNode> left=new ArrayList<>();
List<TreeNode> right=new ArrayList<>();
for(int i=begin;i<=last;i++)
{
left=build(begin,i-1);
right=build(i+1, last);
for(int k=0;k<left.size();k++)
{
for(int j=0;j<right.size();j++)
{
TreeNode root=new TreeNode(i);
root.left=left.get(k);
root.right=right.get(j);
list.add(root);
}
}
}
return list;
}
}
}