1. 給定一個二叉樹,如何判斷它是對稱的

        共 2987字,需瀏覽 6分鐘

         ·

        2021-04-03 19:56

        面試官也在看的前端面試資料

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

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

        進階:

        你可以運用遞歸和迭代兩種方法解決這個問題嗎?

        解答:

        一棵二叉樹對稱,則需要滿足:根的左右子樹是鏡像對稱的

        也就是說,每棵樹的左子樹都和另外一顆樹的右子樹鏡像對稱,左子樹的根節(jié)點值與右子樹的根節(jié)點值相等

        所以,我們需要比較:

        • 左右子樹的根節(jié)點值是否相等
        • 左右子樹是否鏡像對稱

        邊界條件:

        • 左右子樹都為 null 時,返回 true
        • 左右子樹有一個 null 時,返回 false

        解法一:遞歸

        const isSymmetric = function(root{
            if(!root) return true
            var isEqual = function(left, right{
                if(!left && !right) return true
                if(!left || !right) return false
                return left.val === right.val
                 && isEqual(left.left, right.right)
                 && isEqual(left.right, right.left)
            }
            return isEqual(root.left, root.right)
        };

        復雜度分析:

        • 時間復雜度:O(n)
        • 空間復雜度:O(n)

        解法二:迭代

        利用棧來記錄比較的過程,實際上,遞歸就使用了調用棧,所以這里我們可以使用棧來模擬遞歸的過程

        • 首先根的左右子樹入棧
        • 將左右子樹出棧,比較兩個數(shù)是否互為鏡像
        • 如果左右子樹的根節(jié)點值相等,則將左子樹的 left 、右子樹的 right 、左子樹的 right 、右子樹的 left 依次入棧
        • 繼續(xù)出棧(一次出棧兩個進行比較)…….

        依次循環(huán)出棧入棧,直到棧為空

        const isSymmetric = function(root{
            if(!root) return true
            let stack = [root.left, root.right]
            while(stack.length) {
                let right = stack.pop()
                let left = stack.pop()
                if(left && right) {
                    if(left.val !== right.val) return false
                    stack.push(left.left)
                    stack.push(right.right)
                    stack.push(left.right)
                    stack.push(right.left)
                } else if(left || right) {
                    return false
                }
            }
            return true
        };

        復雜度分析:

        • 時間復雜度:O(n)
        • 空間復雜度:O(n)

        來自:https://github.com/sisterAn/JavaScript-Algorithms

        最后

        歡迎關注「三分鐘學前端」,回復「交流」自動加入前端三分鐘進階群,每日一道編程算法面試題(含解答),助力你成為更優(yōu)秀的前端開發(fā)!
        》》面試官也在看的前端面試資料《《
        “在看和轉發(fā)”就是最大的支持
        瀏覽 33
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
          
          

            1. 日本护士卖婬视频 | 人人看人人摸人人插 | 五月婷婷丁香社区 | 啊嗯轻一点进去了视频 | 日韩精品一区二区三区免费 |