今日题目
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 rootleft = self.invertTree(root.left)right = self.invertTree(root.right)root.left, root.right = right, leftreturn 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 Trueif not p or not q:return Falsereturn 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 0return 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 0if 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))