問題描述
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
Bonus points if you could solve it both recursively and iteratively.
給定一個二叉樹,檢查它是否是自身的鏡像(即圍繞其中心對稱)。
最好能遞歸地和迭代地解決它。
二叉樹 [1,2,2,3,4,4,3] 是對稱的:
1
/ \
2 2
/ \ / \
3 4 4 3
但這個二叉樹 [1,2,2,null,3,null,3] 不對稱:
1
/ \
2 2
\ \
3 3
Python 實現
實現一:遞歸實現(Recursively)
思路很簡單,分別從左右兩個子樹鏡像比較節點的值是否相等。
class Solution(object):
def isSymmetric(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
if root == None:
return True
# Recursively.
return self.isEqual(root.left, root.right)
def isEqual(self, n1, n2):
if n1 == None and n2 == None:
return True
elif n1 == None or n2 == None:
return False
elif n1.val == n2.val:
return self.isEqual(n1.left, n2.right) and self.isEqual(n1.right, n2.left)
else:
return False
實現二:迭代實現(Iteratively)
迭代法稍微比較難理解,不過基本思路跟 BFS (廣度優先搜索 BreadthFirstSearch)類似。對於根節點而言,左右子樹分別用一個列表來儲存,這兩個列表當作是兩個棧(stack)來使用。左列表用於處理左子樹,右列表用於處理左子樹(注意,這裏的左右列表僅僅針對根節點而言)。
每一次比較,都是取左列表的第一個元素與右列表的最後一個元素進行比較(可以理解成是樹用中序遍歷表示時,取得第一個節點與最後一個節點,在這個題目裏這兩個節點位置是對稱的)。如果兩個元素的值(val)相等,則同時出棧,即移出列表,然後分別用他們的子樹替代原本在列表中的位置(這一步就跟 BFS 的實現一致)。
這樣,在過程只要出現兩個比較節點的值不相等,或者兩個比較節點不同時存在,則說明樹不是對稱的。
class Solution(object):
def isSymmetric(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
if root == None:
return True
# Iteratively.
if root.left == None and root.right == None:
return True
if root.left == None or root.right == None:
return False
left_list = [root.left]
right_list = [root.right]
while len(left_list) > 0 and len(right_list) > 0:
if left_list[0].val == right_list[-1].val:
n1 = left_list.pop(0)
n2 = right_list.pop(-1)
if n1.right != None and n2.left != None:
left_list.insert(0, n1.right)
right_list.append(n2.left)
elif n1.right == None and n2.left == None:
pass
else:
return False
if n1.left != None and n2.right != None:
left_list.insert(0, n1.left)
right_list.append(n2.right)
elif n1.left == None and n2.right == None:
pass
else:
return False
else:
return False
return True