Leetcode Hot100|96.不同的二叉搜索树 Python

这篇博客探讨了如何使用动态规划方法解决计算二叉搜索树种类的算法问题。通过理解二叉搜索树的特性,可以将树的划分转化为矩阵的乘法,逐行填充矩阵并最终得到结果。代码实现中展示了具体的动态规划解决方案。

在这里插入图片描述
题目如上,题意很好理解。
这道题关键是要熟悉二叉搜索树的一个关键性质,即若某个节点的左子树不为空,则左子树所有节点的值小于根节点的值,若他的右子树不为空,则右子树上所有节点都小于根节点的值。

有了这个性质,我们很容易有这样一种想法——尝试对二叉搜索树选择某个根节点进行划分为左右子树,则当前二叉搜索树的种类数等于左子树的种类乘右子树的种类。

借助动态规划,加上刚才提到的思路,我们便能很自然地提出解法。

在这里插入图片描述
代码实现如下:

class Solution(object):
    def numTrees(self, n):
        """
        :type n: int
        :rtype: int
        """
        mat = [[1 for i in range(n)] for j in range(n)]

        for l in range(1, n):  #对距离进行遍历,以便依次访问对角线
            for start in range(n - l):
                end = start + l
                val = 0
                for k in range(start, end + 1):  #选根节点
                    left = mat[start][k - 1] if k > start else 1
                    right = mat[k + 1][end] if k < end else 1
                    val += left * right
                mat[start][end] = val
        # print(mat)
        return mat[0][n - 1]

最后结果:
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值