题目所属分类
递归的做法返回二叉搜索树
原题链接
给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。
注:由于二叉搜索树中,每个结点左子树上所有结点的值都小于该结点的值,右子树上所有结点的值都大于该结点的值,因此对二叉搜索树进行中序遍历后,得到的是升序序列也就不难理解了。
代码案例:
输入:n = 3
输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]
题解
1、在给定的区间[l,r]中,枚举区间中的数i作为当前二叉搜索树的根结点,并在[l,i - 1]中构造出属于左子树的二叉搜索树的集合,在[i + 1,r]中构造出属于右子树的二叉搜索树的集合
2、左子树的集合中的任意二叉搜索树 和 右子树集合中的任意二叉搜索树 都能与 当前根结点i进行拼接形成新的二叉搜索树,枚举左子树的集合元素a以及右子树的集合元素b,用root.left = a和root.right = b进行二叉搜索树的拼接,记录在答案中
这也是次数的计算公式
/**
* 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) {
return dfs(1 , n ) ;
}
List<TreeNode> dfs(int l , int r ){
List<TreeNode> res = new ArrayList<>();
if(l > r ){
res.add(null);
return res;
}
for(int i = l ; i <= r ; i++){
List<TreeNode> left = dfs(l , i -1 );
List<TreeNode> right = dfs(i+1 , r);
for(TreeNode a : left){
for(TreeNode b : right){
TreeNode root = new TreeNode(i) ;
root.left = a ;
root.right = b ;
res.add(root);
}
}
}
return res;
}
}