请假

这两天喉咙发炎, 头晕眼花, 只能写一些简单题了

二叉树的中序遍历

# 递归, 非常简单而且常用
# 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 inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        ans = []
        def dfs(node):
            # 访问到左子树的末尾. 返回
            if not node:
                return 
            # 先访问左子树
            dfs(node.left)
            # 左子树访问完, 访问根节点
            ans.append(node.val)
            # 然后访问右子树
            dfs(node.right)
        dfs(root)
        return 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 inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        ans, stack = [], []
        cur = root
        # 当前节点不为空, 则右子树不为空或者为初始节点, stack不为空而cur为空, 则是右子树是空的, 但是还没有访问完所有节点
        while cur or stack:
            while cur:
                # 一路向左
                stack.append(cur)
                cur = cur.left
            # 出栈
            cur = stack.pop()
            ans.append(cur.val)
            cur = cur.right

        return 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 maxDepth(self, root: Optional[TreeNode]) -> int:
        cnt = 1
        if not root:
            return 0
        q = deque([(root, 1)])
        while q:
            cur, cur_cnt = q.pop()
            cnt = max(cnt, cur_cnt)
            if cur.left:
                q.append((cur.left, cur_cnt + 1))
            if cur.right:
                q.append((cur.right, cur_cnt + 1))
        return cnt
# 层序遍历
# 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:
        cnt = 0
        if not root:
            return 0
        q = deque([root])
        while q:
            for _ in range(len(q)):
                # 注意要popleft才是弹出当前层
                cur = q.popleft()
                if cur.left:
                    q.append(cur.left)
                if cur.right:
                    q.append(cur.right)
            cnt += 1
        return cnt

翻转二叉树

# 递归写法
# 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 invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        if not root:
            return root
		# 一路往下到最后一层然后开始子树翻转
        root.left, root.right = self.invertTree(root.right), self.invertTree(root.left)
        return root

对称二叉树

# 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:
        # 空树视为对称
        if not root:
            return True
      
        # di'gui
        def dfs(l, r):
            if not l and not r:
                return True
            if not l or l not r:
                return False
            if l.val != r.val:
                return False
            return dfs(l.left, r.right) and dfs(l.right, r.left)
      
        return dfs(root.left, root.right)

一天是牛马, 一辈子是牛马