递归
public boolean check(TreeNode p, TreeNode q){
if (p == null && q == null){
return true;
}
if (p == null || q == null){
return false;
}
return p.val == q.val && check(p.left, q.right) && check(p.right,q.left);
}
public boolean isSymmetric(TreeNode root) {
return check(root, root);
}
时空间复杂度都是o(n)
迭代
引入一个队列,这是把递归程序改写成迭代程序的常用方法。初始化时把根节点入队两次。每次提取两个结点并比较它们的值(队列中每两个连续的结点应该是相等的,而且它们的子树互为镜像),然后将两个结点的左右子结点按相反的顺序插入队列中。当队列为空时,或者检测到树不对称(即从队列中取出两个不相等的连续结点)时,该算法结束。
public boolean isSymmetric(TreeNode root) {
if (root == null){
return true;
}
Queue<TreeNode> queue = new LinkedList<TreeNode> ();
queue.offer(root);
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode temp1 = queue.poll();
TreeNode temp2 = queue.poll();
if (temp1 == null && temp2 == null){
continue;
}
if ((temp1 == null || temp2 == null) || (temp1.val != temp2.val)){
return false;
}
queue.offer(temp1.left);
queue.offer(temp2.right);
queue.offer(temp1.right);
queue.offer(temp2.left);
}
return true;
}
时空间复杂度都是o(n)