题目描述
操作给定的二叉树,将其变换为源二叉树的镜像。
输入描述:
二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5
解题思路1:递归解法。
Python代码如下:
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 返回镜像树的根节点
def Mirror(self, root):
# write code here
if not root:
return root
root.left,root.right = self.Mirror(root.right),self.Mirror(root.left)
return root
有一种错误写法如下:root.left改变之后,再对root.right进行改变时会使用已经改变的root.left,出错!
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 返回镜像树的根节点
def Mirror(self, root):
# write code here
if not root:
return root
root.left = self.Mirror(root.right)
root.right = self.Mirror(root.left)
return root
解题思路2:非递归解法。和二叉树的层次遍历类似,使用队列来记录未翻转的树节点。每次从队列中取出一个结点,交换左右子树,并将不为空的左右子树加入到队列中去,直到队列为空。
Python代码如下:
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 返回镜像树的根节点
def Mirror(self, root):
# write code here
if not root:
return root
q = [root]
while q:
node = q.pop()
node.left,node.right = node.right,node.left
if node.left:
q.append(node.left)
if node.right:
q.append(node.right)