力扣每日一题(四十六——不同的二叉搜索树)

仅以此纪录每日LeetCode所刷题目。

题目描述:

示例:

 

思路:

这道题要返回的形式为:

1、该节点存在左右节点:root.val(root.left.val)(root.right.val)

2、该节点存在左节点但不存在右节点:root.val(root.left.val)

3、该节点存在右节点但不存在左节点:root.val()(root.right.val)

总结来说就是没有右节点可以省略右括号,但没有左节点不可以省略左括号。

因此这道题使用迭代方法并分成三种情况。分别是空树、无右节点和无左右节点。

代码:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def tree2str(self, root: Optional[TreeNode]) -> str:
        if root is None:
            return ""
        if root.left is None and root.right is None:
            return str(root.val)
        if root.right is None:
            return f"{root.val}({self.tree2str(root.left)})"
        return f"{root.val}({self.tree2str(root.left)})({self.tree2str(root.right)})"

 题目描述:

示例:

 

思路:

首先我们应该了解二叉树中序遍历的顺序:左节点->中间节点->右节点

之后这道题和上面的题一样,使用迭代方法即可求解。

代码:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:

    def inOrder(self, root:TreeNode, res):
        if root == None:
            return
        self.inOrder(root.left, res)
        res.append(root.val)
        self.inOrder(root.right, res)

    def inorderTraversal(self, root: TreeNode) -> List[int]:
        res = []
        self.inOrder(root, res)
        return res

 题目描述:

示例:

 

思路:

二叉搜索树定义:左节点全部小于中间节点,右节点全部大于中间节点。

这道题使用的也是迭代方法,我们直到n = 0或1时。结果都是1。

之后随着n的增大,f(n)都可以通过f(n-1)和f(n-2)计算出来。

举个例子:

n = 2时,存在的情况为(左1中间、中间1右1)

此时f(2) = f(1) + f(1) = 2

n = 3时,存在的情况为(左2中间1、左1中间1右1、中间1右2)

此时f(3) = f(1)*f(2) + f(1)*f(1) + f(2)*f(1) =2+1+2=5

n = 4时,存在的情况为(左3中间1、左2中间1右1、左1中间1右2、中间1右3)

此时f(4) = f(3) + f(2)*f(1) + f(2)*f(1) + f(3) =5+2+2+5=14

代码:

class Solution:
    def numTrees(self, n: int) -> int:
        dp = [0] * (n + 1)
        dp[0] = 1
        dp[1] = 1
        for i in range(2,n+1):
            for j in range(1,i+1):
                dp[i] += dp[j-1] * dp[i-j]
        return dp[n]

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值