LeetCode101-對稱二叉樹

 

非商業,LeetCode連接附上:java

https://leetcode-cn.com/problems/symmetric-tree/this

進入正題。spa

 

題目:.net

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

 

示例:blog

例如,二叉樹 [1,2,2,3,4,4,3] 是對稱的。遞歸

 1 / \ 2 2 / \ / \ 3 4 4 3

可是下面這個 [1,2,2,null,3,null,3] 則不是鏡像對稱的:leetcode

 1 / \ 2 2 \ \ 3 3

進階:get

你能夠運用遞歸和迭代兩種方法解決這個問題嗎?同步

 

代碼實現:

//節點
class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
  
        public TreeNode(int val) {
            this.val = val;
        }
}

//方法一 遞歸
class Solution {
    public boolean isSymmetric(TreeNode root) {
        
        return check(root, root);

    }

    private boolean check(TreeNode p, TreeNode q) {


        if(p == null && q == null) {
            return true;
        }
        if(p == null || q == null) {
            return  false;
        }
        
        return p.val == q.val && check(p.left, q.right) && check(p.right, q.left);

    }
}
//時間複雜度O(n),空間複雜度O(n)

//方法二 迭代
class Solution {
    public boolean isSymmetric(TreeNode root) {
        
        if(root == null) {
            return true;
        }

        return check(root.left, root.right);

    }

    private boolean check(TreeNode p, TreeNode q) {


        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(p);
        queue.offer(q);
        while (!queue.isEmpty()) {
            p = queue.poll();
            q = queue.poll();
            if(p == null && q == null) {
                continue;
            }
            if((p == null) || (q == null) || (p.val != q.val)) {
                return false;
            }
            queue.offer(p.left);
            queue.offer(q.right);

            queue.offer(p.right);
            queue.offer(q.left);
        }
        
        return true;

    }
}
//時間複雜度O(n),空間複雜度O(n)

 

分析:

題目中針對「對稱二叉樹」,要先找出「對稱二叉樹」的特色;

針對對稱二叉樹的特色進行遞歸的終止條件設置以及迭代時節點的存取及比較方式。

 

--End

 

本文同步分享在 博客"黑冰臺"(CNBlog)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索