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