leetcode 101. 对称二叉树

本文介绍了一种检查二叉树是否为镜像对称的方法,通过递归和迭代两种方式实现。递归方法比较两子树是否互为镜像,而迭代方法使用队列进行BFS遍历,确保每个节点与其镜像节点相等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个二叉树,检查它是否是镜像对称的。

例如,二叉树 [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

说明:

如果你可以运用递归和迭代两种方法解决这个问题,会很加分。


可以把传进来的这棵树当成两棵进行处理,判断这两个树互为镜像的地方是否相等即可。

若两棵树互为镜像,则

  1. 它们的根节点的值相等。
  2. 每棵树的右子树与另一棵树的左子树互为镜像。

Push an element in stack

所以对于递归的版本,可以这样写:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isSymmetric(TreeNode root) {
        return cal(root,root);
    }
    
    boolean cal(TreeNode r1,TreeNode r2){
        if(r1==null&&r2==null)return true;
        if(r1==null||r2==null)return false;
        return r1.val==r2.val&&cal(r1.left,r2.right)&&cal(r1.right,r2.left);
    }
}

对于迭代的版本,需要用到一个队列。对两棵树进行类似BFS的遍历,但是每次将两棵树的左右子树以相反的顺序入队,即先将r1的左子树和r2的右子树入队,再将r1的右子树和r2的左子树入队,这样队列中每两个连续的节点就是两棵树中互为镜像的节点,再检查这两个节点是否相等即可。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isSymmetric(TreeNode root) {
        Queue<TreeNode> q = new LinkedList<>();
        q.add(root);
        q.add(root);
        while(!q.isEmpty()){
            TreeNode r1=q.poll();
            TreeNode r2=q.poll();
            if(r1==null&&r2==null)continue;
            if(r1==null||r2==null)return false;
            if(r1.val!=r2.val)return false;
            q.add(r1.left);
            q.add(r2.right);
            q.add(r1.right);
            q.add(r2.left);
        }
        return true;
    }
}

 本文参考了leetcode上的解读。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值