classSolution: defaverageOfLevels(self, root: Optional[TreeNode]) -> List[float]: ifnot root: return [] q = deque([root]) res = [] while q: n = len(q) sum = 0.0 for _ inrange(n): node = q.popleft() if node.right: q.append(node.right) if node.left: q.append(node.left) sum += node.val res.append(sum/n) return res
classSolution: defzigzagLevelOrder(self, root: Optional[TreeNode]) -> List[List[int]]: ifnot root: return [] q = deque([root]) res = [] flag = -1 while q: n = len(q) list = [] for _ inrange(n): node = q.popleft() list.append(node.val) if node.left: q.append(node.left) if node.right: q.append(node.right) if flag == 1: list.reverse() flag *= -1 res.append(list) return res
classSolution: defconnect(self, root: 'Node') -> 'Node': cur=root while cur: ans=dummy=Node() while cur: if cur.left: ans.next=cur.left ans=ans.next if cur.right: ans.next=cur.right ans=cur.right cur=cur.next cur=dummy.next return root
碰到个bug 力扣给的Node的构造函数是这样的:
1 2 3 4 5 6 7 8 9
""" # Definition for a Node. class Node: def __init__(self, val: int = 0, left: 'Node' = None, right: 'Node' = None, next: 'Node' = None): self.val = val self.left = left self.right = right self.next = next """
classSolution: defsumNumbers(self, root: Optional[TreeNode]) -> int: global s s = 0 defdfs(root: Optional[TreeNode],last): global s if root.left isNoneand root.right isNone: s += last * 10 + root.val if root.left: dfs(root.left, last * 10 + root.val) if root.right: dfs(root.right, last * 10 + root.val)
classSolution: deflowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': if root isNone : returnNone if root.val == p.val or root.val == q.val: return root left = self.lowestCommonAncestor(root.left, p, q) right = self.lowestCommonAncestor(root.right, p, q) if left isNone: return right if right isNone: return left return root
classSolution: defcountNodes(self, root: Optional[TreeNode]) -> int: ifnot root: return0 ifnot root.left: return1 p = root depth = -1 while p: depth += 1 p = p.left left = 0 right = 2 ** depth mid = right // 2 while left < right: p = root num = bin(mid).replace('0b', '').rjust(depth,'0') for n inrange(len(num)): if num[n] == '0': p = p.left else: p = p.right if p: left = mid+1 ifnot p: right = mid mid = (left + right ) // 2 res = 0 res = (2 ** depth - 1) + left # 直接计算前 depth 层节点数 + 最后一层 return res
看到大佬用递归划分完全二叉树和普通二叉树的 太强了 时间复杂度也是O(logN * logN)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
classSolution: defcountNodes(self, root: Optional[TreeNode]) -> int: left, right = root, root ld, rd = 0, 0 while left: ld += 1 left = left.left while right: rd += 1 right = right.right # 按照满二叉树计算 if ld == rd: returnpow(2, ld) - 1 # 按照普通二叉树计算 return1+self.countNodes(root.left)+self.countNodes(root.right)
defencode(self, strs, map_dict): res_dict = {} for i inrange(len(strs)): s = strs[i] num = 1 for c in s: num *= map_dict[c] if num in res_dict.keys(): res_dict[num].append(s) else: res_dict[num] = [s] return res_dict
classSolution: deflongestConsecutive(self, nums: List[int]) -> int: ifnot nums: return0 hash_table = set(nums) res = 0 for i in hash_table: if i - 1notin hash_table: cur_num = i