给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
进阶:
你可以运用递归(深度周游)和迭代(广度周游)两种方法解决这个问题吗?
class Solution {
Queue queue = new LinkedList();
Stack stack = new Stack();
public boolean isSymmetric(TreeNode root) {
preOrder(root);
postOrder(root);
while (!queue.isEmpty() && !stack.isEmpty()) {
if (!queue.poll().equals(stack.pop())) return false;
}
return true;
}
public void preOrder(TreeNode root) {
if (root != null) {
queue.add(root.val);
preOrder(root.left);
preOrder(root.right);
} else queue.add("N");
}
public void postOrder(TreeNode root) {
if (root != null) {
postOrder(root.left);
postOrder(root.right);
stack.push(root.val);
} else stack.push("N");
}
}
class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null) return true;
return isMirror(root.left, root.right);
}
private boolean isMirror(TreeNode left, TreeNode right) {
if (left == null && right == null) return true;
if (left == null || right == null) return false;
return left.val == right.val && isMirror(left.left, right.right) && isMirror(left.right, right.left);
}
}
class Solution {
Queue queue = new LinkedList();
public boolean isSymmetric(TreeNode root) {
if (root == null || (root.left == null && root.right == null)) return true;
if (root.left != null && root.right != null) return levelOrder(root.left, root.right);
return false;
}
private boolean levelOrder(TreeNode rootLeft, TreeNode rootRight) {
queue.add(rootLeft);
queue.add(rootRight);
while (!queue.isEmpty()) {
TreeNode t1 = (TreeNode) queue.poll();
TreeNode t2 = (TreeNode) queue.poll();
if (t1 != null && t2 != null) {
if (t1.val != t2.val) return false;
queue.add(t1.left);
queue.add(t2.right);
queue.add(t1.right);
queue.add(t2.left);
} else if (t1 == null && t2 == null) {
} else {
return false;
}
}
return true;
}
}