# 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 classSolution: defisSymmetric(self, root: Optional[TreeNode]) -> bool: # 时间:遍历整个树On # 空间:最坏情况下n次嵌套,On defdfs_symmetric(p, q): if p isNoneor q isNone: return p is q # 只有两边都为空才能True,否则False return p.val==q.val and dfs_symmetric(p.left, q.right) and dfs_symmetric(p.right, q.left) return dfs_symmetric(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 classSolution: defisBalanced(self, root: Optional[TreeNode]) -> bool: # 时间:遍历整个树On # 空间:最坏情况下n次嵌套,On defgetDepth(root): # 求节点高度,如果不平衡传-1(高度都是正数) ifnot root: return1 left = getDepth(root.left) right = getDepth(root.right) if left == -1or right == -1: return -1
# 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 classSolution: deffindFrequentTreeSum(self, root: Optional[TreeNode]) -> List[int]: # 需要先得到所有的子树元素和,维护哈希表,最后再取哈希表值按出现次数排序降序 # 时间:遍历整个树,有对每个子树元素和以及对应频率排序,最坏情况下Onlogn,最好On # 空间:存储整个树的子树元素和以及对应频次,加上衍生存储,On rec = defaultdict(int) defdfs(root): ifnot root: return0 l = dfs(root.left) r = dfs(root.right) cur = l+r+root.val rec[cur] += 1 return cur
dfs(root) cnt = [] for s, c in rec.items(): cnt.append((c, s)) cnt.sort(reverse=True) # 非升序,按频次 # print(rec, cnt) ans = [cnt[0][1]] for pair in cnt[1:]: if pair[0] == cnt[0][0]: # 频次相同的也加上 ans.append(pair[1]) else: break return ans