刷题:二叉树的镜像
问题描述
操作给定的二叉树,将其变换为源二叉树的镜像。
数据范围:二叉树的节点数 0≤
n
n
n≤1000, 二叉树每个节点的值0≤
v
a
l
val
val≤1000
要求: 空间复杂度
O
(
n
)
O(n)
O(n)。本题也有原地操作,即空间复杂度
O
(
1
)
O(1)
O(1)的解法,时间复杂度
O
(
n
)
O(n)
O(n)
比如:
源二叉树
镜像二叉树
递归解法:
class Solution:
def Mirror(self, pRoot: TreeNode) -> TreeNode:
# write code here
if not pRoot or (not pRoot.left and not pRoot.right):
return pRoot
lChild = pRoot.left
rChild = pRoot.right
if lChild or rChild:
t = lChild
pRoot.left = rChild
pRoot.right = t
if lChild:
lChild = self.Mirror(lChild)
if rChild:
rChild = self.Mirror(rChild)
return pRoot
记录一下我的思想感悟,交换树的左右子树不是单纯地交换指向左右孩子的指针,而是要真正地改变pRoot.left和pRoot.right。就比如说,下面的代码就是错误的示例:
def Mirror(self , pRoot: TreeNode) -> TreeNode:
# write code here
if not pRoot or (not pRoot.left and not pRoot.right):
return pRoot
lChild = pRoot.left
rChild = pRoot.right
if lChild or rChild:
t = lChild
lChild = rChild # 这里不能单纯地写lChild,而是要写pRoot.left
rChild = t # 这里不能单纯地写rChild,而是要写pRoot.right
if lChild:
lChild = self.Mirror(lChild)
if rChild:
rChild = self.Mirror(rChild)
return pRoot