剑指 Offer 28. 对称的二叉树

本文介绍了一个高效算法,用于判断二叉树是否对称,通过递归比较左右子树的节点值和结构,时间复杂度仅为O(n),避免了镜像操作带来的额外空间和时间开销。

摘要生成于 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

/**

 * Definition for a binary tree node.

 * public class TreeNode {

 *     public int val;

 *     public TreeNode left;

 *     public TreeNode right;

 *     public TreeNode(int x) { val = x; }

 * }

 */

 //所谓和它的镜像一样,就是将二叉树用上一题的算法镜像之后,得到的新二叉树和原来的一样

//但是本题没有必要先进行镜像操作再去比较,原因如下:

//镜像后的二叉树需要和原树比较,因此必须生成一颗新的镜像后的二叉树,额外需要O(n)的空间和O(n)O(n)的空间和O(n)的时间

//可以有更直接的方法判断当前二叉树是否对称

//若二叉树要对称,需要满足root的左子树和右子树对称

//两颗子树对称,需要满足:

//子树的根节点的val相等

//子树1的左子树和子树2的右子树对称 并且 子树1的右子树和子树2的左子树对称

//若两颗子树都是null,也算对称

//时间复杂度O(n),空间复杂度O(h),hO(n),空间复杂度O(h),h为二叉树的高度

public class Solution {

    public bool IsSymmetric(TreeNode root) {

        if(root==null){

            return true;

        }

        return IsSymmetricInternal(root.left,root.right);

    }

    public bool IsSymmetricInternal(TreeNode a,TreeNode b){

        if(a==null&&b==null){

            return true;

        }

        if(a==null||b==null){

            return false;

        }

        if(a.val!=b.val){

            return false;

        }

        return IsSymmetricInternal(a.left,b.right)&&IsSymmetricInternal(a.right,b.left);

    }

}

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/dui-cheng-de-er-cha-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值