Leetcode刷题记录——96. 不同的二叉搜索树

在这里插入图片描述

动态规划
选定一个root,其可形成的可能的二叉搜索树的数量为dp(root)
则 dp(root) = 1*dp(root.left)*dp(root.right)
其中1代表选定了root后只有一种情况
而因为所有的数都可能成为root
所以 我们需要遍历数组,让所有数都当一次root
选定i为root后,[1,…,i-1]即为左子树的候选
[i+1,…,n]为右子树的候选
递归即可

class Solution:
    def __init__(self):
        self.ind = {}
    def numTrees(self, n: int) -> int:
        res = self.generate_2_layer(1,n)
        return res if n != 0 else 0
    def generate_2_layer(self,start,end):
        if (start,end) in self.ind:
            return self.ind[(start,end)]
        res_list = []
        for i in range(start,end + 1):
            res = 1
            left_tree = self.generate_2_layer(start,i-1) if i > start else 1
            right_tree = self.generate_2_layer(i+1,end) if i < end else 1
            res = res * left_tree
            res = res * right_tree
            res_list.append(res)   
        suma = sum(res_list) 
        self.ind[(start,end)] = suma
        return suma
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值