用一道題學習怎麼寫遞歸

二叉樹的層序遍歷-(leetcode101-對稱二叉樹)

點開這裏的朋友不妨關注一下公衆號“一個直男的救贖之路”,獲取更多實用諮詢。

公衆號主要分享的知識包括:人工智能,計算機視覺,算法,編程語言學習(python,java,c/c++),大學生競賽,學習方法心得,好書推薦等,歡迎您一起交流和學習。

公衆號也會經常分享一些優質資源和教學視頻,電子書等。

搜索“一個直男的救贖之路”,也可以掃描下方的二維碼添加:

mark

一、題目描述

給定一個二叉樹,檢查它是否是鏡像對稱的。

例如,二叉樹 [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

搜索“一個直男的救贖之路”,也可以掃描下方的二維碼添加:

mark

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章