题目描述:
二叉树的镜像就是二叉树对称的二叉树,就是
交换每一个非叶子结点的左子树指针和右子树指针
,如下图所示。注意,请勿对该树做任何假设,它不一定是平衡二叉树,也不一定有序。
思路:
从上面的图可以看出,要实现二叉树的镜像反转,只需要交换二叉树中所有结点的左右孩子即可。由于对所有的结点都做了同样的操作,所以可以用递归的方法来实现。由于按层打印二叉树,所以需要用到队列。
代码实现:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2020/1/26 10:58
# @Author : buu
# @Software: PyCharm
# @Blog :https://blog.csdn.net/weixin_44321080
from collections import deque
class BiTNode:
def __init__(self):
self.data = None
self.lchild = None
self.rchild = None
def reverseTree(root):
if root == None:
return
reverseTree(root.lchild)
reverseTree(root.rchild)
tmp = root.lchild
root.lchild = root.rchild
root.rchild = tmp
def array2treee(arr, start, end):
"""
把有序数组转换为二叉树
:param arr:数组
:param start:数组起点
:param end:数组终点
:return:
"""
root = None
if end >= start:
root = BiTNode()
mid = (start + end + 1) // 2
root.data = arr[mid] # 树的根节点为数组中间的元素
# print(root.data,end=' ')
root.lchild = array2treee(arr, start, mid - 1) # 递归地构建左子树
root.rchild = array2treee(arr, mid + 1, end) # 递归地构建右子树
else:
root = None
return root
def printTreeLayer(root):
"""
层次遍历树并打印结点
:param root: 要遍历的树的根节点
:return:
"""
if root == None:
return
queue = deque()
queue.append(root)
while len(queue) > 0:
p = queue.popleft() # 队首出队列
print(p.data, end=' ')
if p.lchild != None:
queue.append(p.lchild) # 左孩子存在,则入队
if p.rchild != None:
queue.append(p.rchild) # 右孩子存在,则入队
if __name__ == '__main__':
arr = [1, 2, 3, 4, 5, 6, 7]
root = array2treee(arr, 0, len(arr) - 1)
print('before: ', end='')
printTreeLayer(root)
print()
reverseTree(root)
print('after: ', end='')
printTreeLayer(root)
结果:
算法性能分析:
对给定的二叉树进行了一次遍历,时间复杂度为O(n);
end