• Leetcode 中等:95. 不同的二叉搜索树II


    题目:不同的二叉搜索树II

    • 题号:95
    • 难度:中等
    • https://leetcode-cn.com/problems/unique-binary-search-trees-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]]
    
    • 1
    • 2

    示例2

    输入:n = 1
    输出:[[1]]
    
    • 1
    • 2

    提示:

    • 1 <= n <= 8

    实现

    思路:递归

    如果将i作为根节点,那么[1, i-1]i的左子树节点,[i+1, n]为右子树节点。

    问题就被拆分为两个子问题了:

    • 求左区间构成的所有二叉搜索树作为i的左子树
    • 求右区间构成的所有二叉搜索树作为i的右子树

    递归终止条件:

    • 区间为空,返回null。
    • 区间的左右端点相同,即只包含一个数,返回该数构成的根结点。

    以上就是利用递归求解该问题的思路。

    C# 语言

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     public int val;
     *     public TreeNode left;
     *     public TreeNode right;
     *     public TreeNode(int x) { val = x; }
     * }
     */
     
    public class Solution
    {
        public IList<TreeNode> GenerateTrees(int n)
        {
            if (n == 0)
            {
                return new List<TreeNode>();
            }
            return GenerateTrees(1, n);
        }
        
        public List<TreeNode> GenerateTrees(int start, int end)
        {
            List<TreeNode> lst = new List<TreeNode>();
            //此时没有数字,将 null 加入结果中
            if (start > end)
            {
                lst.Add(null);
                return lst;
            }
            //只有一个数字,当前数字作为一棵树加入结果中
            if (start == end)
            {
                TreeNode tree = new TreeNode(start);
                lst.Add(tree);
                return lst;
            }
            //尝试每个数字作为根节点
            for (int i = start; i <= end; i++)
            {
                //得到所有可能的左子树
                List<TreeNode> leftTrees = GenerateTrees(start, i - 1);
                //得到所有可能的右子树
                List<TreeNode> rightTrees = GenerateTrees(i + 1, end);
                //左子树右子树两两组合
                foreach (TreeNode leftTree in leftTrees)
                {
                    foreach (TreeNode rightTree in rightTrees)
                    {
                        TreeNode root = new TreeNode(i);
                        root.left = leftTree;
                        root.right = rightTree;
                        //加入到最终结果中
                        lst.Add(root);
                    }
                }
            }
            return lst;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    Python 语言

    # Definition for a binary tree node.
    # class TreeNode(object):
    #     def __init__(self, val=0, left=None, right=None):
    #         self.val = val
    #         self.left = left
    #         self.right = right
    
    class Solution(object):
        def generateTrees(self, n):
            """
            :type n: int
            :rtype: List[TreeNode]
            """
            if n == 0:
                return list()
            return self.generate(1, n)
        
        def generate(self, start, end):
            lst = list()
            if start > end:
                lst.append(None)
                return lst
                
            if start == end:
                tree = TreeNode(start)
                lst.append(tree)
                return lst
                
            for i in range(start, end + 1):
                leftTrees = self.generate(start, i - 1)
                rightTrees = self.generate(i + 1, end)
                for leftTree in leftTrees:
                    for rightTree in rightTrees:
                        tree = TreeNode(i)
                        tree.left = leftTree
                        tree.right = rightTree
                        lst.append(tree)
            return lst
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
  • 相关阅读:
    创建型-原型模式
    C#毕业设计——基于C#+asp.net+sqlserver的学生信息管理系统设计与实现(毕业论文+程序源码)——学生信息管理系统
    【MyBatis篇】MyBatis框架基础知识笔记
    Java系列之:认识和使用jshell
    DDos系列攻击原理与防御原理
    XML外部实体漏洞 (XXE)简介
    安卓系统架构
    StarkNet System Architecture 系统架构
    元数据管理-解决方案调研二:元数据管理解决方案——Saas/内部解决方案(2)
    使用OpenSSL生成自签证书
  • 原文地址:https://blog.csdn.net/AlgorithmCharm/article/details/127130073