题目
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
说明:
如果你可以运用递归和迭代两种方法解决这个问题,会很加分。
递归的思路
很容易想到:
如果两个树的根节点都为空,返回true如果两个树A、B的根节点都不为空,并且值相等,等可以递归判断A.left 和 B.right以及A.right 和 B.left否则(两个根节点只有一个为空,或者值不相等)就返回false
递归代码:
class Solution {
public boolean isSymmetric(TreeNode root
) {
if(root
== null
) return true;
return fun(root
.left
, root
.right
);
}
public boolean fun(TreeNode left
, TreeNode right
){
if(left
== null
&& right
== null
) return true;
if(left
!= null
&& right
!= null
&& left
.val
== right
.val
){
return fun(left
.left
,right
.right
) && fun(left
.right
,right
.left
);
}
else return false;
}
}
迭代的思路
使用队列,判断两个连续的值是否相同开始存了两次root的值,后来存的就是对称位置的值当判断poll出来的两个都为空时,应该是continue,而不是返回true队列初始化:Queue<TreeNode> queue = new LinkedList<>();,后面的不是queue判断队列是否为空,不是用null,而是isEmpty()
迭代的代码
class Solution {
public boolean isSymmetric(TreeNode root
) {
if(root
== null
) return true;
Queue
<TreeNode> queue
= new LinkedList<>();
queue
.add(root
);
queue
.add(root
);
while(!queue
.isEmpty()){
TreeNode x
= queue
.poll();
TreeNode y
= queue
.poll();
if(x
== null
&& y
== null
) continue;
if(x
!=null
&& y
!= null
&& x
.val
== y
.val
){
queue
.add(x
.left
);
queue
.add(y
.right
);
queue
.add(x
.right
);
queue
.add(y
.left
);
}
else return false;
}
return true;
}
}