Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
一、题目:
leetcode 不同的二叉搜索树 II
给你一个整数 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
二、题解:
1.解读 二叉搜索树的定义是如果左节点的子树不为空,那么左子树的所有节点值都小于根节点;如果右节点的子树不为空,那么右子树的所有节点值都大于根节点;对于其他的子树也是如此。需要生成1到n个节点组成的不同二叉搜索树。
方法一
对于二叉搜索树的定义,如果我们把i作为树的根节点,那么左子树的节点值范围就是小于等于i - 1的值,右子树的节点值范围就是大于等于i + 1,而左子树和右子树也是这个原理,那么我们可以递归求出每个子树然后组合即可。具体的定义generateTrees(start, end)方法,表示求[start, end]内生成的所以不同二叉树。然后我们把[start, end]内的每个值i都当做根节点再求其左子树和右子树,左子树lefts的为generateTrees(start, i - 1),右子树rights的为generateTrees(i + 1, end)。然后再将左子树和右子树都拼接到当前i作为根节点的树上。初始的就是求[1, n]的不同二叉树集合,而当generateTrees(start, end)方法的start > end时当前节点就是空。
三、代码:
方法一 java代码
class Solution {
public List<TreeNode> generateTrees(int n) {
return generateTrees(1, n);
}
public List<TreeNode> generateTrees(int start, int end) {
List<TreeNode> ans = new LinkedList<TreeNode>();
if (start > end) {
ans.add(null);
return ans;
}
for (int i = start; i <= end; i++) {
List<TreeNode> lefts = generateTrees(start, i - 1);
List<TreeNode> rights = generateTrees(i + 1, end);
for (TreeNode left : lefts) {
for (TreeNode right : rights) {
TreeNode tree = new TreeNode(i);
tree.left = left;
tree.right = right;
ans.add(tree);
}
}
}
return ans;
}
}
时间复杂度:
空间复杂度:
四、总结
理解了二叉树的本质就简单了。