一:劍指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