import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

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

    // 递归法
    private boolean isSymmetricRecursion(TreeNode nodeOne, TreeNode nodeTwo) {
        if(nodeOne == null && nodeTwo == null) {
            return true;
        }
        if(nodeOne == null || nodeTwo == null || nodeOne.val != nodeTwo.val) {
            return false;
        }
        return isSymmetricRecursion(nodeOne.left, nodeTwo.right) && isSymmetricRecursion(nodeOne.right, nodeTwo.left);
    }

    // 迭代法
    private boolean isSymmetricIteration(TreeNode root) {
        Queue<TreeNode> queue = new LinkedList();
        queue.add(root.left);
        queue.add(root.right);
        while(!queue.isEmpty()) {
            TreeNode leftNode = queue.remove();
            TreeNode rightNode = queue.remove();
            if(leftNode == null && rightNode == null) {
                continue;
            }
            if(leftNode == null || rightNode == null || leftNode.val != rightNode.val) {
                return false;
            }
            queue.add(leftNode.left);
            queue.add(rightNode.right);
            queue.add(leftNode.right);
            queue.add(rightNode.left);
        }
        return true;
    }
}