Python程序员面试算法宝典---解题总结: 第三章 二叉树 3.11 如何对二叉树进行镜像反转

# -*- 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()

猜你喜欢

转载自blog.csdn.net/qingyuanluofeng/article/details/92001883