剑指offer 面试题27. 二叉树的镜像(易) & LeetCode 226. 翻转二叉树(易)

画图,将抽象问题形象化。

Question

请完成一个函数,输入一个二叉树,该函数输出它的镜像。

例如输入:

1
2
3
4
5
      4
/ \
2 7
/ \ / \
1 3 6 9
镜像输出:
1
2
3
4
5
      4
/ \
7 2
/ \ / \
9 6 3 1
示例 1:
1
2
输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]
限制:0 <= 节点个数 <= 1000

测试用例

功能测试(普通的二叉树;二叉树的所有节点都没有左子树或者右子树:只有一个节点的二叉树)。 特殊输入测试(二叉树的根节点为nullptr指针)。

本题考点

考查应聘者对二叉树的理解。本题实质上是利用树的遍历算法解决问题。 考查应聘者的思维能力。树的镜像是一个抽象的概念,应聘者需要在短时间内想清楚求镜像的步骤并转换为代码。应聘者可以通过画图把抽象的问题形象化,这有助于其快速找到解题思路。

Intuition

总结上面的过程,我们得出求一棵树的镜像的过程:先前序遍历这棵树的每个节点,如果遍历到的节点有子节点,就交换它的两个子节点。当交换完所有非叶节点的左、右子节点之后,就得到了树的镜像。

Snipaste_2020-05-09_10-20-26.png

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None

class Solution:
def mirrorTree(self, root: TreeNode) -> TreeNode:
# 特判
if root == None: return None # 输入根节点为空,也就是空树,直接返回None

# 递归终止
# 到达叶子节点就不交换子节点了,直接返回叶子,本来是可以不做处理的,
# 但是如果输入的就是一个单节点树,那么还是返回root的,否则会报错。
if root.left == None and root.right == None: return root

# 左右子树交换
p = root.left
root.left = root.right
root.right = p

# 递归
if root.left:
root.left = self.mirrorTree(root.left)
if root.right:
root.right = self.mirrorTree(root.right)

# 返回根节点
return root