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

 

posted @ 2020-08-18 16:07  maoguai  阅读(165)  评论(0编辑  收藏  举报