题目描述
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree is symmetric:
But the following is not:
Note:
Bonus points if you could solve it both recursively and iteratively.
分析
递归
参考LeetCode 100 Same Tree,仅仅将判断条件改成p.left和q.right、p.right和q.left相比即可。
迭代
考虑用队列,每次add两个对应的结点。
如果队列长度为0,则退出循环;否则取出队列中的两个结点,对值进行判断。
代码
// recursively
public static boolean isSymmetric(TreeNode root) {
if (root == null) {
return true;
}
return isSymmetric(root.left, root.right);
}
static boolean isSymmetric(TreeNode p, TreeNode q) {
if (p == null && q == null) {
return true;
} else if (p == null || q == null) {
return false;
}
return p.val == q.val && isSymmetric(p.left, q.right)
&& isSymmetric(p.right, q.left);
}
// iteratively
public static boolean isSymmetric2(TreeNode root) {
if (root == null) {
return true;
}
Deque<TreeNode> deque = new LinkedList<TreeNode>();
if (root.left == null && root.right == null) {
return true;
} else if (root.left == null || root.right == null) {
return false;
} else {
deque.addLast(root.left);
deque.addLast(root.right);
}
while (deque.size() != 0) {
TreeNode p = deque.pop();
TreeNode q = deque.pop();
if (p.val != q.val) {
return false;
}
if (p.left == null && q.right == null) {
// do nothing
} else if (p.left == null || q.right == null) {
return false;
} else {
deque.addLast(p.left);
deque.addLast(q.right);
}
if (p.right == null && q.left == null) {
// do nothing
} else if (p.right == null || q.left == null) {
return false;
} else {
deque.addLast(p.right);
deque.addLast(q.left);
}
}
return true;
}