(力扣每日一题)不同的二叉搜索树 II

不同的二叉搜索树 II

给定一个整数 n,生成所有由 1 … n 为节点所组成的 二叉搜索树 。
在这里插入图片描述
提示:
0 <= n <= 8
解题思路
二叉搜索树有以下几个特点:
(1)、左边的小于当前;
(2)、右边的大于当前;
(3)、没有重复的值。
为了符合二叉搜索树的这几个特点,我们需要知道当前的范围。(要知道开头和结尾;最开始是1和n)
1、首先定义一个字典保存已遍历的参数和结果以免重复。
2、特殊情况判断:如果n == 0,返回[],如果不判断则会返回[None](执行递归代码会直接返回,因为0<1)。
3、递归终止条件:
如果left>right则返回[None]。
以前已经遍历过当前节点则可以直接返回以前的结果。
当前的值可能是left……right,所以我们要把每一个都试一遍,每次循环都要这么做:
递归得到左和右,将返回列表增加它们的全部组合。(值:当前循环变量,左:当前左,右:当前右)
将元组(left,right)作为键,返回列表为值加入字典,然后返回。

代码

class Solution:
    def generateTrees(self, n: int) -> List[TreeNode]:
        if n == 0:
            return []
        dct = {}

        def left_right(left: int, right: int) -> List[TreeNode]:
            if left > right:
                return [None]
            if (left, right) in dct:
                return dct[(left, right)]
            ret = []
            for i in range(left, right+1):
                left_lst = left_right(left, i-1)
                right_lst = left_right(i+1, right)
                for L in left_lst:
                    for R in right_lst:
                        app_Tree = TreeNode(i)
                        app_Tree.left = L
                        app_Tree.right = R
                        ret.append(app_Tree)
            dct[(left, right)] = ret
            return ret

        left_right(1, n)
        return left_right(1, n)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值