题目描述
请完成一个函数,输入一个二叉树,该函数输出它的镜像。
來源:力扣(LeetCode)
解题思路
- 保持根节点不动,当存在左子节点 or 存在右子节点的时候,交换彼此的位置。
- 主流:递归解法。使用树的遍历算法解决问题。
- 延伸:使用循环解法
(a) 创立一个queue:起始值为 deque([root])
(b) 若 queue 当中仍有值(node),将node.left
或是node.right
也存进 queue 当中,判断完成后,使用deque.popleft()
将 node 从 queue 移除,并左右交换子节点,完成一次判断。
在 Leetcode 上看到别人分享的代码:使用辅助队列法,广度优先遍历该树,每遍历一个节点,就交换该节点的左右子节点,最后返回该树
- 注意事项:画图让抽象问题形象化:
- 当面对的题目很抽象的时候,可以靠画图辅助形象化。第二步是可以透过画图找规律,进而找到问题的解决方案。
- 面试此类题目时,要先想清楚+分析(例如画图或是讨论)后,再开始写代码,千万别一开始就埋入写代码,会让面试官觉得没想清楚就动手,不太好。(再次 Echo 设计解法的重要性***)
Python代码
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
# 递归解法
class Solution:
def mirrorTree(self, root: TreeNode) -> TreeNode:
if not root:
return None
if not root.left and not root.right:
return root
root.left, root.right = root.right, root.left
if root.left:
self.mirrorTree(root.left)
if root.right:
self.mirrorTree(root.right)
return root
# 循环解法
class Solution:
def mirrorTree(self, root: TreeNode) -> TreeNode:
if not root:
return None
queue = deque([root])
while queue:
node = queue.popleft()
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
node.left, node.right = node.right, node.left
return root