hot100练习-10
class Solution:def numTrees(self, n: int) -> int:store = [1, 1]if n <= 1:return store[n]for i in range(2, n+1):j = i-1cnt = 0for k in range(i):cnt += store[k]*store[j-k]store.append(cnt)return store[n]
store[i]存放的是有i个数字,我们可以构建几种搜索树,状态转移方程就是如果把当前k下标当做根节点,他的结果就是左子树的情况*右子树的情况,然后把结果放到store里面。
DFS
# 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 maxDepth(self, root: Optional[TreeNode]) -> int:if not root:return 0return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1
BFS
# 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 maxDepth(self, root: Optional[TreeNode]) -> int:if not root:return 0queue = [root]ans = 0while queue:tmp = []for node in queue:if node.left: tmp.append(node.left)if node.right: tmp.append(node.right)queue = tmpans += 1return ans
# 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 isValidBST(self, root, left = -inf, right = inf):if not root:return Truex = root.valreturn left < x < right and self.isValidBST(root.left, left, x) and self.isValidBST(root.right, x, 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 isSymmetric(self, root: Optional[TreeNode]) -> bool:def func(L, R):if not L and not R: return Trueif not L or not R or L.val != R.val: return Falsereturn func(L.left, R.right) and func(L.right, R.left)return not root or func(root.left, 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 levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:if not root: return []ans = []q = collections.deque()q.append(root)while q:tmp = []for _ in range(len(q)):node = q.popleft()tmp.append(node.val)if node.left: q.append(node.left)if node.right: q.append(node.right)ans.append(tmp)return ans
为啥要用deque?
因为使用 collections 中的双端队列 deque() ,其 popleft() 方法可达到 O(1) 时间复杂度;列表 list 的 pop(0) 方法时间复杂度为 O(N) 。