问答题 3.  二叉树的镜像就是二叉树对称的二叉树,就是交换每一个非叶子结点的左子树指针和右子树指针,如下图所示,请写出能实现该功能的代码。注意:请勿对该树做任何假设,它不一定是平衡树,也不一定有序。
   
【正确答案】从上图可以看出,要实现二叉树的镜像反转,只需交换二叉树中所有结点的左右孩子即可。由于对所有的结点都做了同样的操作,因此,可以用递归的方法来实现,由于需要调用printTreeLayer层序打印二叉树,这种方法中使用了队列来实现,实现代码如下:
   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 arraytotree(arr,start,end):
   root=None
   if end>=start:
   root=BiTNode()
   mid=(start+end+1)/2
   #树的根结点为数组中间的元素
   root.data=arr[mid]
   #递归的用左半部分数组构造root的左子树
   root.lchild=arraytotre e(arr,start,mid-1)
   #递归的用右半部分数组构造root的右子树
   root.rchild=arraytotree(arr, mid+1, end)
   else:
   root=None
   return root
   
   def printTreeLayer(root):
   if root==None:
   return
   queue=deque()
   #树根结点进队列
   queue.append(root)
   while len(queue)>0:
   p=queue.popleft()
   #访问当前结点
   print p.data,
   #如果这个结点的左孩子不为空则入队列
   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=arraytotree(arr,0,len(arr)-1)
   print "二叉树层序遍历结果为:",
   printTreeLayer(root)
   print '\n'
   reverseTree(root)
   print "反转后的二叉树层序遍历结果为:",
   printTreeLayer(root)
   程序的运行结果为:
   二叉树层序遍历结果为:4 2 6 1 3 5 7
   反转后的二叉树层序遍历结果为:4 6 2 7 5 3 1
   算法性能分析:
   由于对给定的二叉树进行了一次遍历,因此,时间复杂度为O(N)。
【答案解析】[考点] 如何对二叉树进行镜像反转