思路
corner case:假设根节点为null,也是true的
首先判断左右子树的根节点是否值相等,若相等:需要left.left == right.right && left.right == right.left 才能为镜像树,否则为false。
复杂度
时间复杂度O(n), 空间复杂度O(n)[最坏情况为一条线]
代码
递归实现
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root == null)
return true;
return isMirror(root.left, root.right);
}
public boolean isMirror(TreeNode left, TreeNode right) {
if(left == null || right == null)
return (left == right);
if(left.val == right.val) {
return isMirror(left.left, right.right) && isMirror(left.right, right.left);
}
return false;
}
}
非递归实现
类似bfs/层序遍历
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root == null)
return true;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
queue.offer(root);
while(!queue.isEmpty()) {
TreeNode t1 = queue.poll();
TreeNode t2 = queue.poll();
if(t1 == null && t2 == null)
continue;
if(t1 == null || t2 == null)
return false;
if(t1.val != t2.val)
return false;
queue.offer(t1.left);
queue.offer(t2.right);
queue.offer(t1.right);
queue.offer(t2.left);
}
return true;
}
}