题目描述
给你一个整数
n
,请你生成并返回所有由n
个节点组成且节点值从1
到n
互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。
示例1
输入:n = 3
输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]
示例2
输入:n = 1 输出:[[1]]
做题思路
1.二叉搜索树的一个重要特性:根节点的值大于左子树中所有节点的值,小于右子树中所有节点的值。
2.给定一个有序序列1…n,为构建出一棵二叉树,我们可以遍历每个数字i,将该数字作为树根,将1…(i-1)序列作为左子树,将(i+1)…n序列作为右子树,接着我们可以按照同样的方式递归构建左子树和右子树。然后我们遍历所有的左子树和右子树集合,将它们进行拼接,拼接后得到的二叉树添加进列表中,我们需要注意递归结束的条件为start>end。
代码
/**
* 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 {
public List<TreeNode> generateTrees(int n) {
if(n==0){
return new LinkedList<TreeNode>();
}
return generateTrees(1,n);
}
public List<TreeNode> generateTrees(int start,int end){
List<TreeNode> trees=new LinkedList<TreeNode>();
//递归结束条件
if(start>end){
trees.add(null);
return trees;
}
for(int i=start;i<=end;i++){
//获得所有可行的左子树集合
List<TreeNode> leftTrees=generateTrees(start,i-1);
//获得所有可行的右子树集合
List<TreeNode> rightTrees=generateTrees(i+1,end);
//将左子树和右子树进行拼接
for(TreeNode left:leftTrees){
for(TreeNode right:rightTrees){
TreeNode cur=new TreeNode(i);
cur.left=left;
cur.right=right;
trees.add(cur);
}
}
}
return trees;
}
}