面试题27:二叉树的镜像
题目:请完成一个函数,输入一棵二叉树,该函数输出它的镜像。
二叉树的镜像定义:源二叉树
8
/ \
6 10
/ \ / \
5 7 9 11
镜像二叉树
8
/ \
10 6
/ \ / \
11 9 7 5
Python代码:
class Solution:
# 返回镜像树的根节点
def Mirror(self, root):
if root != None:
root.left,root.right = root.right,root.left
self.Mirror(root.left)
self.Mirror(root.right)
面试题28:对称的二叉树
题目:请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。例如,在图中所示的3棵二叉树中,第一棵二叉树是对称的,而另外两棵不是。
思路:
定义一种遍历算法,先遍历右子节点再遍历左子节点。
Python语言描述:
class TreeNode:
def __init__(self, x):
self.val =x
self.left =None
self.right =None
class Solution:
def isSymmetrical(self, pRoot):
if not pRoot:
return True
return self.recursiveTree(pRoot.left, pRoot.right)
def recursiveTree(self, left, right):
if not left and not right:
return True
if not left or not right:
return False
if left.val ==right.val:
return self.recursiveTree(left.left, right.right) and self.recursiveTree(left.right, right.left)
return False
面试题29:顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
class Solution:
# matrix类型为二维列表,需要返回列表
#剑指offer面试题:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字 - CSDN博客 http://blog.csdn.net/yanxiaolx/article/details/52254590
def printMatrix(self, matrix):
# write code here
if matrix==[[]]:
return
row=len(matrix)
column=len(matrix[0])
left=0
right=column-1
top=0
boom=row-1
res=[]
while right>left and top<boom:
#从左到右
for i in range(left,right+1):
res.append(matrix[top][i])
#从上到下
for i in range(top+1,boom+1):
res.append(matrix[i][right])
#从右到左
for i in range(right-1,left-1,-1):
res.append(matrix[boom][i])
#从下到上
for i in range(boom-1,top,-1):
res.append(matrix[i][left])
left+=1
right-=1
top+=1
boom-=1
#剩下一行
if boom==top and left<right:
for i in range(left,right+1):
res.append(matrix[boom][i])
#剩下一列
if left==right and boom>top:
for i in range(top,boom+1):
res.append(matrix[i][left])
#剩下一个
if boom==top and left==right:
res.append(matrix[left][top])
return res
# -*- coding:utf-8 -*-
class Solution:
# matrix类型为二维列表,需要返回列表
def printMatrix(self, matrix):
# write code here
if matrix==[[]]:
return
row=len(matrix)
column=len(matrix[0])
start=0
res=[]
while row>start*2 and column>start*2:
endX=column-1-start
endY=row-1-start
#从左到右打印一行
for i in range(start,endX+1):
res.append(matrix[start][i])
#print(matrix[start][i])
#从上往下打印一列
if start<endY:
for i in range(start+1,endY+1):
res.append(matrix[i][endX])
#print(matrix[i][endX])
#从右到左打印一行
if start<endX and start<endY:
for i in range(endX-1,start-1,-1):
res.append(matrix[endY][i])
#print(matrix[endY][i])
#从下到上打印一列
if start<endX and start<endY-1:
for i in range(endY-1,start,-1):
res.append(matrix[i][start])
#print(matrix[i][start])
start+=1
return res