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