183 字 少于 1 分钟阅读

给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [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. 递归

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root == null){
            return true;
        }
        return traversal(root.left, root.right);
    }

    public boolean traversal(TreeNode nodeLeft, TreeNode nodeRight){
        if (nodeLeft == null && nodeRight != null){
            return false;
        }
        if (nodeLeft != null && nodeRight == null){
            return false;
        }
        if (nodeLeft == null && nodeRight == null){
            return true;
        }
        if (nodeLeft.val != nodeRight.val){
            return false;
        }
        boolean flagOutside = traversal(nodeLeft.left, nodeRight.right);
        boolean flagInside = traversal(nodeLeft.right, nodeRight.left);
        return flagOutside && flagInside;
    }
}

2. 迭代

使用分层遍历的思路

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.isEmpty()){
            TreeNode rightNode = deque.poll();
            TreeNode leftNode = deque.poll();
            if (rightNode == null && leftNode == null){
                continue;
            }
            if (leftNode == null || rightNode == null || leftNode.val != rightNode.val) {
                return false;
            }
            deque.offer(leftNode.left);
            deque.offer(rightNode.right);
            deque.offer(leftNode.right);
            deque.offer(rightNode.left);
        }
        return true;
    }
}