目录:
目的:
操作给定的二叉树,将其变换为源二叉树的镜像。
思路
镜像的意思是将树中每个节点的左子树和右子树互换。
通过递归,将树的每个节点的左右子树互换。
详细步骤:
- 判断是否为空:如果当前节点为空,直接返回,因为没有需要处理的内容。
- 递归调用左子树和右子树:
- 递归处理当前节点的左子树,得到镜像后的左子树。
- 递归处理当前节点的右子树,得到镜像后的右子树。
- 交换左右子树:将递归得到的左子树和右子树互换。
- 返回处理后的根节点:最后返回镜像后的树的根节点。
示例:
1
/ \
2 3
/ \
4 5
递归过程:
-
处理根节点
1
:- 递归左子树
2
。 - 递归右子树
3
。 - 左右子树互换后,
1
的左子树变为3
,右子树变为2
。
- 递归左子树
-
处理节点
2
:- 递归左子树
4
。 - 递归右子树
5
。 - 左右子树互换后,
2
的左子树变为5
,右子树变为4
。
- 递归左子树
-
处理节点
4
和5
(叶子节点):- 左子树为空,返回
None
。 - 右子树为空,返回
None
。 - 左右互换后,
4
和5
没有变化。
- 左子树为空,返回
-
处理节点
3
(叶子节点):- 左子树为空,返回
None
。 - 右子树为空,返回
None
。 - 左右互换后,
3
没有变化。
- 左子树为空,返回
1
/ \
3 2
/ \
5 4
复杂度
-
时间复杂度:O(n)
- 对每个节点只进行了访问一次,其中
n
是树中的节点数。
- 对每个节点只进行了访问一次,其中
-
空间复杂度:O(n)
- 递归调用栈的深度等于树的高度。在最坏的情况下(完全不平衡的树),空间复杂度为 O(n),在最好的情况下(平衡的树),空间复杂度为 O(log n)。
记忆秘诀
- 递归左子树:将左子树镜像。
- 递归右子树:将右子树镜像。
- 交换左右子树:将镜像后的左右子树互换。
python代码
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def Mirror(self, pRoot: TreeNode) -> TreeNode:
# 如果树为空,直接返回
if pRoot is None:
return None
# 递归镜像左右子树
left = self.Mirror(pRoot.left)
right = self.Mirror(pRoot.right)
# 交换左右子树
pRoot.left = right
pRoot.right = left
return pRoot
* 欢迎大家探讨新思路,能够更好的理解和记忆