这道题的解法是用递归的思想将每个非叶子节点的左右子树互换,思路非常简单。
class TreeNode:
'''
定义树结构
'''
def __init__(self, val):
self.val = val
self.left = None
self.right = None
class MirrorOfTree:
def mirrorOfTree(self, pRoot):
'''
对于每个非叶子结点,交换它的孩子结果,然后对其孩子结果进行相同的操作;
全过程通过递归实现
'''
if not pRoot:
return pRoot
pRoot.left, pRoot.right = self.mirrorOfTree(pRoot.right), self.mirrorOfTree(pRoot.left)
return pRoot
def printTree(self, pRoot):
'''
层级遍历打印,不存在的节点打印 #
'''
result = []
tmp = []
if not pRoot:
return result
tmp.append(pRoot)
result.append(pRoot.val)
while tmp:
pNode = tmp.pop(0)
if pNode.left:
tmp.append(pNode.left)
result.append(pNode.left.val)
else:
result.append('#')
if pNode.right:
tmp.append(pNode.right)
result.append(pNode.right.val)
else:
result.append("#")
return result
if __name__ == '__main__':
#------------建树1--------------#
pHead1 = TreeNode(1)
pHead1.left = TreeNode(2)
pHead1.right = TreeNode(3)
pHead1.left.left = TreeNode(4)
pHead1.left.right = TreeNode(5)
pHead1.right.left = TreeNode(6)
pHead1.right.right = TreeNode(7)
#------------建树2--------------#
pHead2 = None
#------------建树3--------------#
pHead3 = TreeNode(1)
pHead3.left = TreeNode(2)
pHead3.left.left = TreeNode(4)
pHead3.left.right = TreeNode(5)
#-------------测试--------------#
mirror = MirrorOfTree()
pHeadM1 = mirror.mirrorOfTree(pHead1)
tree1 = mirror.printTree(pHeadM1)
assert(tree1==[1, 3, 2, 7, 6, 5, 4, '#', '#', '#', '#', '#', '#', '#', '#'])
pHeadM2 = mirror.mirrorOfTree(pHead2)
assert(pHeadM2==None)
pHeadM3 = mirror.mirrorOfTree(pHead3)
tree3 = mirror.printTree(pHeadM3)
assert(tree3==[1, '#', 2, 5, 4, '#', '#', '#', '#'])
代码中一共定义了两个类,TreeNode用来定义二叉树节点的结构。功能的实现在MirrorOfTree中,其中mirrorOfTree中实现了递归交换左右子树的操作。printTree实现了层次打印二叉树的操作,为空的节点用‘#’代替 (这貌似又是一道题~)。