1. 程式人生 > 實用技巧 >Leetcode 劍指Offer 28.對稱的二叉樹

Leetcode 劍指Offer 28.對稱的二叉樹

題目定義:

請實現一個函式,用來判斷一棵二叉樹是不是對稱的。如果一棵二叉樹和它的映象一樣,那麼它是對稱的。

例如,二叉樹[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:
輸入:root = [1,2,2,3,4,4,3]
輸出:true
        
示例 2:
輸入:root = [1,2,2,null,3,null,3]
輸出:false

限制:

  0 <= 節點個數 <= 1000
  注意:本題與主站 101 題相同:https://leetcode-cn.com/problems/symmetric-tree/

遞迴方式(自頂向下):

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root == null)
            return true;
        return dfs(root.left,root.right);
    }
    private boolean dfs(TreeNode left,TreeNode right){
        if(left == null && right == null)
            return true;
        if(left == null || right == null || left.val != right.val)
            return false;
        return dfs(left.left,right.right) && dfs(left.right,right.left);
    }
}

迭代方式:

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root == null)
            return true;
        Deque<TreeNode> deque = new LinkedList<>();
        deque.offer(root.left);
        deque.offer(root.right);
        while(deque.size() > 0){
            int size = deque.size();
            for(int i = 0; i < size; i += 2){
                TreeNode node1 = deque.poll();
                TreeNode node2 = deque.poll();
                if(node1 ==null && node2 == null)
                    continue;
                if(node1 == null || node2 == null || node1.val != node2.val)
                    return false;
                deque.offer(node1.left);
                deque.offer(node2.right);
                deque.offer(node1.right);
                deque.offer(node2.left);
            }
        }
        return true;
    } 
}

參考:

https://leetcode-cn.com/problems/dui-cheng-de-er-cha-shu-lcof/