难度:Medium
题目:
给你一个整数
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 <= n <= 8
Related Topics
- 树
- 二叉搜索树
- 动态规划
- 回溯
- 二叉树
重点!!!解题思路
第一步:
明确解题手段:二叉搜索树的性质,左面比根小,右面比根大,所以我们可以采用dfs来解决
第二步:
通过dfs来分别模拟给定的1-n个节点,分别模拟出左子树以及右子树,递归求解
源码+讲解:
class Solution {
public List<TreeNode> generateTrees(int n) {
if (n==0) return new ArrayList<TreeNode>(); //n的判空条件
return dfs(1,n);
}
public List<TreeNode> dfs(int l,int r){
List<TreeNode> res = new ArrayList<>();
if (l>r){ //dfs首先明确退出条件
res.add(null);
return res;
}
for (int i=l;i<=r;i++){ //分别模拟每个头节点
List<TreeNode> left_tree=dfs(l,i-1); //递归求解左子树
List<TreeNode> right_tree=dfs(i+1,r); //递归求解右子树
for (TreeNode left:left_tree){
for (TreeNode right:right_tree){
TreeNode node = new TreeNode(i,left,right); //分别遍历左右子树,创建成一个树
res.add(node);
}
}
}
return res;
}
}
运行结果:
系列持续更新中,喜欢练习算法的那就点个攒吧