# -*- coding: utf-8 -*-
'''
Python程序员面试算法宝典---解题总结: 第三章 二叉树 3.11 如何对二叉树进行镜像反转
题目:
二叉树的镜像就是二叉树堆成的二叉树,就是交换每一个非叶子节点的左子树指针和
右子树指针,如下图所示,请写出能实现该功能的代码。注意: 请勿对该树做任何假设,
它不一定是平衡树,也不一定有序。
原始树:
4
2 6
1 3 5 7
翻转后:
4
6 2
7 5 3 1
分析:
可以用递归做。
对于根节点,分别翻转左孩子与右孩子。
对于以左孩子为根节点的左子树,重复上述操作。
递归终止条件就是:如果一个结点是叶子节点则直接返回
关键:
参考:
Python程序员面试算法宝典
'''
import Queue
class BinaryTreeNode(object):
def __init__(self, data, left=None, right=None):
self.data = data
self.left = left
self.right = right
def buildTree(data, begin, end):
if not data:
return
if begin > end:
return
elif begin == end:
return BinaryTreeNode(data[begin])
size = end - begin + 1
middle = size / 2 + begin
root = BinaryTreeNode(data[middle])
left = buildTree(data, begin, middle - 1)
right = buildTree(data, middle + 1, end)
root.left = left
root.right = right
return root
def buildMirrorTree(root):
if not root:
return
if root.left is None and root.right is None:
return root
left = buildMirrorTree(root.left)
right = buildMirrorTree(root.right)
root.left = right
root.right = left
return root
def inOrder(root, result):
if not root:
return
inOrder(root.left, result)
result.append(root.data)
inOrder(root.right, result)
def levelOrder(root):
if not root:
return
queue = Queue.Queue()
queue.put(root)
result = list()
while not queue.empty():
node = queue.get()
if not node:
continue
result.append(node.data)
if node.left:
queue.put(node.left)
if node.right:
queue.put(node.right)
print result
def process():
data = list(range(1, 8))
root = buildTree(data, 0, len(data) - 1)
levelOrder(root)
newRoot= buildMirrorTree(root)
levelOrder(newRoot)
if __name__ == "__main__":
process()
Python程序员面试算法宝典---解题总结: 第三章 二叉树 3.11 如何对二叉树进行镜像反转
猜你喜欢
转载自blog.csdn.net/qingyuanluofeng/article/details/92001883
今日推荐
周排行