不同的二叉搜索树 II

114 阅读1分钟

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;
    }
}

时间复杂度:image.png

空间复杂度:image.png

四、总结

理解了二叉树的本质就简单了。