一:剑指offer:二叉树的镜像
1.1 题意
操作给定的二叉树,将其变换为源二叉树的镜像。
1.2 思路
这是道简单题,只需要把左右子树的值交换就行,先序遍历,自顶向下进行交换,也就是最左边节点与最右边节点交换值,其他也一样。
改变了二叉树的形态了,变成对称的了!
1.3 python实现
class Solution:
# 返回镜像树的根节点
def Mirror(self, root): # 递归来做, 先序遍历
# write code here
if not root: return
root.left, root.right = root.right, root.left
self.Mirror(root.left)
self.Mirror(root.right)
二:leetcode 226. Invert Binary Tree
2.1 题意
给定一棵二叉树,将其翻转成对称的二叉树,如下图所示。
2.2 思路
- 思路一:AC
先序遍历,自顶向下来做,对于每一个子树root,都把左右儿子给交换过来,不是交换值,而是交换了子树啊!
class Solution(object):
def invertTree(self, root):
if not root: return
root.left, root.right = root.right, root.left # 交换了子树
self.invertTree(root.left)
self.invertTree(root.right)
return root
-
思路二:AC
需要改变树的形态,比如左子树有一个左儿子,而右子树没有儿子,
此时也要把左子树的左儿子转移到右子树的右儿子上面,这种是麻烦的,如同下图所示:
如上图所示:
当左右节点都不存在时:return
当左右节点都存在时:只需要交换左右节点的值就行
当只存在一个时: 把存在的那一个子树移植到另外一个不存在的节点那,然后对这个子树继续进行convert() -
思路三:和思路2相似,只是更加简单的递归来实现。
2.3 python实现
思路二:
class Solution(object):
def invertTree(self, root):
if not root: return None
if not root.left and not root.right: return root
def invert(parent1, root1, parent2, root2): # 改变树的形态,先序遍历
if not root1 and not root2: return
elif root1 and not root2:
if parent1.left and parent1.left.val == root1.val: # 左儿子
parent2.right = root1 # 把左儿子移到右儿子
parent1.left = None
invert(root1, root1.left, root1, root1.right) # 子树进行转化
else: # 右儿子
parent2.left = root1 # 把右儿子移到左儿子
parent1.right = None
invert(root1, root1.left, root1, root1.right) # 子树进行转化
elif not root1 and root2:
if parent2.left and parent2.left.val == root2.val: # 左儿子
parent1.right = root2 # 把左儿子移到右儿子
parent2.left = None
invert(root2, root2.left, root2, root2.right) # 子树进行转化
else: # 右儿子
parent1.left = root2 # 把右儿子移到左儿子
parent2.right = None
invert(root2, root2.left, root2, root2.right) # 子树进行转化
else:
root1.val, root2.val = root2.val, root1.val # 交换值
invert(root1, root1.left, root2, root2.right)
invert(root1, root1.right, root2, root2.left)
invert(root, root.left, root, root.right)
return root
思路三:
class Solution(object):
def invertTree(self, root): # 后序遍历,自底向上来改变树的形态
if not root: return None
right = self.invertTree(root.right)
left = self.invertTree(root.left)
root.left, root.right = right, left # 交换左右子树
return root
三:剑指offer: 对称的二叉树
3.1 题意
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
3.2 思路
和上一题有点类似啊,一个是变成对称,这个更简单,只需要判断是否对称就行了
3.3 python实现
class Solution:
def isSymmetrical(self, root):
# write code here
if not root: return True
if not root.left and not root.right: return True
self.res = True
def postOrder(root1, root2):
if not root1 and not root2: return
if root1 and not root2:
self.res = False
return # 只存在一个节点
if not root1 and root2:
self.res = False
return
postOrder(root1.left, root2.right) # 左子树向左走到最左边,右子树向右走到最右边
postOrder(root1.right, root2.left)
if root1.val != root2.val:
self.res = False
return
postOrder(root.left, root.right)
return self.res