给定一个整数 n,生成所有由 1 … n 为节点所组成的二叉搜索树。
解题思路就是,根据二叉树的特性,如果一个数比当前节点小,那么就将数放到当前数的左节点,如果数比当前数大就放到当前节点的右节点。
而1 … n 为节点组成一个二叉搜索树。
那么当当前节点为i的时候,存在[1,i-1]个左子树,[i+1,n]个右子树。
根据上面的思路我们只需要得到从1到n为根节点的树就行了。
在以I为跟节点的时候,获取[1,i-1]的左子树,[i+1,n]的右子树就行。
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public static List<TreeNode> generateTrees(int n) {
if(n == 0){
return null;
}
return getTree(1,n);
}
public static List<TreeNode> getTree(int start, int end){
List<TreeNode> treeNodes = new ArrayList<TreeNode>();
if(start>end){
treeNodes.add(null);
return treeNodes;
}
for (int i =start ;i<=end;i++){
//以i当根节点
//获取左子数
List<TreeNode> leftTreeNode = getTree(start,i-1);
//获取右子数
List<TreeNode> rightTreeNode = getTree(i+1,end);
for (TreeNode leftNode : leftTreeNode) {
for (TreeNode rightNode : rightTreeNode){
//在这里创建新树节点,确保每次往list添加的时候都是一颗新树对象
TreeNode treeNode = new TreeNode(i);
treeNode.left = leftNode;
treeNode.right = rightNode;
treeNodes.add(treeNode);
}
}
}
return treeNodes;
}