📜  门|门 IT 2005 |问题 16(1)

📅  最后修改于: 2023-12-03 14:58:35.826000             🧑  作者: Mango

门|门 IT 2005 |问题 16

简介

本题为门 | 门 IT 2005 机试题第 16 题,要求实现把一棵二叉树转换为它的镜像的函数。

题目描述

请定义一个函数,输入一个二叉树,该函数输出它的镜像。即在镜像二叉树中,左右子树交换位置。

示例

如下二叉树:

         8
       /   \
      6     10
     / \   / \
    5   7 9  11

经过镜像,变成:

         8
       /   \
      10    6
     / \   / \
    11  9 7   5
解题思路

对于每个节点,交换其左右子树。

  1. 若该节点为空,则返回。
  2. 若该节点不为空,则分别交换其左右子树,并递归地对左右子树进行镜像操作。
代码实现
def mirror_tree(node):
    """
    实现二叉树的镜像
    :param node: 二叉树的根节点
    """
    if not node:
        return
    node.left, node.right = node.right, node.left  # 交换左右子树
    mirror_tree(node.left)
    mirror_tree(node.right)
测试代码
class Node:
    """
    二叉树节点定义
    """
    def __init__(self, val, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def inorder_traversal(node):
    """
    中序遍历二叉树
    :param node: 二叉树的根节点
    """
    if node is None:
        return 
    inorder_traversal(node.left)
    print(node.val, end=' ')
    inorder_traversal(node.right)

if __name__ == '__main__':
    root = Node(8, Node(6, Node(5), Node(7)), Node(10, Node(9), Node(11)))
    print('before mirror:')
    inorder_traversal(root)
    print('\n')

    mirror_tree(root)

    print('after mirror:')
    inorder_traversal(root)
    print('\n')

上述测试代码中,定义了二叉树的节点类 Node,和中序遍历函数 inorder_traversal。先构建一个二叉树 root,进行镜像操作,再进行中序遍历打印结果。

输出如下:

before mirror:
5 6 7 8 9 10 11 

after mirror:
11 10 9 8 7 6 5 
复杂度分析

时间复杂度:遍历所有节点,时间复杂度为 O(n)。

空间复杂度:最差情况下(二叉树退化成链表)空间复杂度为 O(n),平均情况下空间复杂度为 O(logn)。