题目描述
操作给定的二叉树,将其变换为源二叉树的镜像。
输入输出示例
输入:{8,6,10,5,7,9,11}
返回值:{8,10,6,11,9,7,5}
解题思路
- 递归:
交换根节点的左右子树;然后递归对左右子树的根节点的左右子树进行交换。 - 非递归:
非递归借助队列,让每一次的结点都保存到队列中,然后当前遍历的根节点出队,并交换其左右结点;判断左右结点是否存在,如果存在就存入队列,存入队列后循环执出队得到遍历节点,继续以同样的方式进行判断;直到队列为空,说明遍历完成。
代码示例
# coding:utf-8
class TreeNode():
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
# 递归方式
def MirrorRe(self, pRoot):
# 判断为空的情况
if pRoot == None:
return None
# 不为空条件下,交换根节点的左右子树
pRoot.left, pRoot.right = pRoot.right, pRoot.left
# 分别对当前树根节点的左右子树进行递归,交换左右子树所在根节点的左右子树
self.Mirror(pRoot.left)
self.Mirror(pRoot.right)
return pRoot
# 非递归方式
def Mirror(self, pRoot):
if pRoot == None:
return None
# 创建一个队列
queue = []
# 重新定义一个节点,用于返回值
root = pRoot
queue.append(pRoot)
while queue:
pRoot = queue.pop(0)
pRoot.left, pRoot.right = pRoot.right, pRoot.left
if pRoot.left:
queue.append(pRoot.left)
if pRoot.right:
queue.append(pRoot.right)
return root
if __name__ == '__main__':
n1 = TreeNode(8)
n2 = TreeNode(6)
n3 = TreeNode(10)
n4 = TreeNode(5)
n5 = TreeNode(7)
n6 = TreeNode(9)
n7 = TreeNode(11)
n1.left = n2
n1.right = n3
n2.left = n4
n2.right = n5
n3.left = n6
n3.right = n7
s = Solution()
result = s.Mirror(n1)
print(result.val)