LeetCode——101.对称二叉树
题目
101.对称二叉树
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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 Solution0101_01 {
public boolean isSymmetric(TreeNode root) {
return isMirror(root, root);
}
public boolean isMirror(TreeNode p, TreeNode q) {
if (p == null && q == null) {
return true; //如果两个节点都为空,显然成立
}
if (p == null || q == null) {
return false; //如果只是其中一个为空,那么不对称
}
//如果当前节点的值相等,且左子树和右子树对称,右子树和左子树对称,就成立
return p.val == q.val && isMirror(p.left, q.right) && isMirror(p.right, q.left);
}
}
迭代
//队列迭代解法
class Solution0101_02 {
public boolean isSymmetric(TreeNode root) {
return isMirror(root, root);
}
public boolean isMirror(TreeNode u, TreeNode v) {
Queue<TreeNode> q = new LinkedList<TreeNode>();
//入队
q.offer(u);
q.offer(v);
while (!q.isEmpty()) {
//出队
u = q.poll();
v = q.poll();
if (u == null && v == null) { //都为空
continue;
}
if ((u == null || v == null) || (u.val != v.val)) { //有一个为空,或者值相等
return false;
}
//将子树入队进行判断
q.offer(u.left);
q.offer(v.right);
q.offer(u.right);
q.offer(v.left);
}
return true;
}
}