二叉樹的層序遍歷-(leetcode101-對稱二叉樹)
點開這裏的朋友不妨關注一下公衆號“一個直男的救贖之路”,獲取更多實用諮詢。
公衆號主要分享的知識包括:人工智能,計算機視覺,算法,編程語言學習(python,java,c/c++),大學生競賽,學習方法心得,好書推薦等,歡迎您一起交流和學習。
公衆號也會經常分享一些優質資源和教學視頻,電子書等。
搜索“一個直男的救贖之路”,也可以掃描下方的二維碼添加:
一、題目描述
給定一個二叉樹,檢查它是否是鏡像對稱的。
例如,二叉樹 [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
二、解決思路以及代碼
第一種辦法,遞歸實現:
遞歸的難點在於:找到可以遞歸的點 爲什麼很多人覺得遞歸一看就會,一寫就廢。 或者說是自己寫無法寫出來,關鍵就是你對遞歸理解的深不深。
對於此題: 遞歸的點怎麼找?從拿到題的第一時間開始,思路如下:
1.怎麼判斷一棵樹是不是對稱二叉樹? 答案:如果所給根節點,爲空,那麼是對稱。如果不爲空的話,當他的左子樹與右子樹對稱時,他對稱
2.那麼怎麼知道左子樹與右子樹對不對稱呢?在這我直接叫爲左樹和右樹 答案:如果左樹的左孩子與右樹的右孩子對稱,左樹的右孩子與右樹的左孩子對稱,那麼這個左樹和右樹就對稱。
仔細讀這句話,是不是有點繞?怎麼感覺有一個功能A我想實現,但我去實現A的時候又要用到A實現後的功能呢?
當你思考到這裏的時候,遞歸點已經出現了: 遞歸點:我在嘗試判斷左樹與右樹對稱的條件時,發現其跟兩樹的孩子的對稱情況有關係。
想到這裏,你不必有太多疑問,上手去按思路寫代碼,函數A(左樹,右樹)功能是返回是否對稱
def 函數A(左樹,右樹): 左樹節點值等於右樹節點值 且 函數A(左樹的左子樹,右樹的右子樹),函數A(左樹的右子樹,右樹的左子樹)均爲真 才返回真
實現完畢。。。
寫着寫着。。。你就發現你寫出來了。。。。。。
class Solution1:
def isSymmetric(self, root):
if root is None:
return True
else:
return self._isSymmetric(root.left, root.right)
def _isSymmetric(self, left, right):
if left is None and right is None:
return True
elif left is None:
return False
elif right is None:
return False
elif left.val == right.val and self._isSymmetric(left.left, right.right) and self._isSymmetric(left.right, right.left):
return True
else:
return False
第二種,利用隊列
其實就是層序遍歷,然後檢查每一層是不是迴文數組
class Solution:
def isSymmetric(self, root: TreeNode) -> bool:
queue = []
if root is None:
return True
else:
queue.append(root)
while queue:
# 下面是每次都需要更新的
next_queue = list()
layer = list()
# 取出queue中的每個節點
for node in queue:
if node:
layer.append(node.val)
# 下一層需要遍歷的
next_queue.append(node.left)
next_queue.append(node.right)
else:
layer.append(None)
queue = next_queue
if layer != layer[::-1]:
return False
return True
搜索“一個直男的救贖之路”,也可以掃描下方的二維碼添加: