代码随想录算法训练营第十四天| 226.翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度

发布于:2025-03-26 ⋅ 阅读:(26) ⋅ 点赞:(0)

今日题目

226.翻转二叉树 

题目链接:226. 翻转二叉树 - 力扣(LeetCode)

思考:翻转二叉树,就是对每一个根节点,都交换左右节点,左右节点进入递归继续交换它们的左右节点。

代码:

# 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
        left = self.invertTree(root.left)
        right = self.invertTree(root.right)
        root.left, root.right = right, left
        return root
101. 对称二叉树 

题目链接:101. 对称二叉树 - 力扣(LeetCode)

思考:如果一个二叉树轴对阵,也就是左子树和右子树完全一样。换个角度,将这个二叉树复制一份,则有两个二叉树AB,A的左子树与B的右子树完全一样,A的右子树与B的左子树完全一样。

完全一样就是要么都为空,要么都不为空且两个节点值相等,两个节点的左右子树镜像相等(即A的左子树与B的右子树完全一样,A的右子树与B的左子树完全一样)。

代码:

# 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 isMirror(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:
        if not p and not q:
            return True
        if not p or not q:
            return False
        return p.val == q.val and self.isMirror(p.left, q.right) and self.isMirror(q.left, p.right)
        
    def isSymmetric(self, root: Optional[TreeNode]) -> bool:
        return self.isMirror(root, root)
104.二叉树的最大深度 

题目链接:104. 二叉树的最大深度 - 力扣(LeetCode)

思考:二叉树的最大深度,即左右子树的最大深度+1,具有最大深度的路径一定在二叉树的最底层,因此进行递归,直到左右子树为空,即从最末一层节点开始,然后逐级向上+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
class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        return 1 + max(self.maxDepth(root.left), self.maxDepth(root.right))
111.二叉树的最小深度 

题目链接:111. 二叉树的最小深度 - 力扣(LeetCode)

思考:二叉树的最小深度,需要找到根节点到叶子结点的最小距离。所谓叶子结点,就是没有子节点的子节点。因此主要判断依据还是左右节点是否存在,通过递归方法,找到左右子树的最小深度。

代码:

# 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 minDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0

        if not root.left and root.right:
            return 1 + self.minDepth(root.right)

        if root.left and not root.right:
            return 1 + self.minDepth(root.left)

        return 1 + min(self.minDepth(root.left), self.minDepth(root.right))