zoukankan      html  css  js  c++  java
  • leetcode刷题-95/96/98

    题目95题

    给定一个整数 n,生成所有由 1 ... n 为节点所组成的 二叉搜索树 。

    示例:

    输入:3
    输出:
    [
      [1,null,3,2],
      [3,2,null,1],
      [3,1,null,null,2],
      [2,1,3],
      [1,null,2,null,3]
    ]
    解释:
    以上的输出对应以下 5 种不同结构的二叉搜索树:

    1 3 3 2 1
    / / /
    3 2 1 1 3 2
    / /
    2 1 2 3

    思路

    递归的思路,选出一个点为根节点,分别添加左子树和右子树

    实现

    # 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 generateTrees(self, n: int) -> List[TreeNode]:
            def generate(start, end):
                if start > end:
                    return [None]
                result = list()
                for i in range(start, end+1):
                    right = generate(i+1, end)
                    left = generate(start, i-1)
                    for l in left:
                        for r in right:
                            node = TreeNode(i, l, r)
                            result.append(node)
                return result
            if n < 1:
                return []
            return generate(1,n)

    题目96题

    给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?

    示例:

    输入: 3
    输出: 5
    解释:
    给定 n = 3, 一共有 5 种不同结构的二叉搜索树:

    1 3 3 2 1
    / / /
    3 2 1 1 3 2
    / /
    2 1 2 3

    思路

    动态规划的思想

    实现

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

    题目98

    给定一个二叉树,判断其是否是一个有效的二叉搜索树。

    假设一个二叉搜索树具有如下特征:

    节点的左子树只包含小于当前节点的数。
    节点的右子树只包含大于当前节点的数。
    所有左子树和右子树自身必须也是二叉搜索树。

    思路

    中序遍历二叉树应该是顺序排列的

    实现

    class Solution:
        def isValidBST(self, root: TreeNode) -> bool:
            result = float('-inf')
            stack = []
            cur = root
            while cur or stack:
                while cur:
                    stack.append(cur) 
                    cur = cur.left
                top = stack.pop()  #此时左子树遍历完成
                if top.val <= result:
                    return False
                result = top.val  #将父节点加入列表
                cur = top.right #遍历右子树
            return True
  • 相关阅读:
    ##3.Keystone 验证服务--openstack
    gitlab一键安装+配置(备份+LADP认证)
    【hexo】03config文件配置详解
    【hexo】01安装
    第6章 linux的文件权限与目录配置
    ubuntu14.04安装Anaconda
    ubuntu14.04安装opencv-python
    ubuntu14.04配置face_recognition环境
    php7 安装时需求的依赖包
    删除包的时候因为依赖关系导致失败的解决方法
  • 原文地址:https://www.cnblogs.com/mgdzy/p/13524100.html
Copyright © 2011-2022 走看看