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]]

示例2

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

提示:

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

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青少年编程小助手_Python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值