「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战」。
描述
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
做题
递归法
停止递归有三个条件:
- 当两个节点都为 null(本来就不存在),返回 true。
- 当某一个节点为 null,这时已经不对称了,返回 false。
- 当两个节点的值相同,返回 true。
这里把第 2、3 结合在一起。
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root == null){
return true;
}
return recurse(root.left,root.right);
}
private boolean recurse(TreeNode left,TreeNode right){
if(left == null && right ==null ){
return true;
}
if(left == null || right == null || left.val != right.val){
return false;
}
//这两个节点相等,继续递归
return recurse(left.right,right.left) && recurse(left.left,right.right);
}
}
迭代法
这里的迭代法和104. 二叉树的最大深度的迭代法差不多。
不同点是,这里是每次放入两个节点,每次取出两个节点来处理。
除此之外,处理逻辑和递归法差不多。
class Solution {
//迭代法
public boolean isSymmetric(TreeNode root) {
if(root == null){
return true;
}
Queue<TreeNode> queue = new LinkedList();
queue.offer(root.left);
queue.offer(root.right);
TreeNode n = null;
TreeNode m = null;
while(!queue.isEmpty()){
n = queue.poll();
m = queue.poll();
if(n == null && m ==null ){
continue;
}
if(n == null || m == null || n.val != m.val){
return false;
}
queue.offer(n.left);
queue.offer(m.right);
queue.offer(n.right);
queue.offer(m.left);
}
return true;
}
}
这迭代法居然比递归法还要腊鸡。
最后
今天就到这里了。
这里是程序员徐小白,【每日算法】是我新开的一个专栏,在这里主要记录我学习算法的日常,也希望我能够坚持每日学习算法,不知道这样的文章风格您是否喜欢,不要吝啬您免费的赞,您的点赞、收藏以及评论都是我下班后坚持更文的动力。