今日题目
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))