剑指 Offer 28. 对称的二叉树无取巧,易于理解!

Posted 来老铁干了这碗代码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 28. 对称的二叉树无取巧,易于理解!相关的知识,希望对你有一定的参考价值。

看题解时,很多大牛用很少的代码就完成了AC,但可能看了很多遍也看不懂,因此萌生了写一种最“笨”最完整的代码的想法,这样大家可以通过我的代码入门,看懂了再去挑战大牛们的简洁解法。


请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。

示例 1:
输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:
输入:root = [1,2,2,null,3,null,3]
输出:false

限制:
0 <= 节点个数 <= 1000


题意:判断某树是否是对称的

最初思路:求出其“左根右”顺序的序列,求出其“右根左”顺序的序列,查看二者序列是否相等即可。

特例:若某个树的所有节点值都是相同的,则上述思路不成立。 因为即使树不对称,节点序列也始终相同。

改进1:将null值加入到序列中,这样就不会因为节点相同而误判。
改进2:直接在递归过程中完成判断,避免开辟多余的存储空间存储数组


class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root == null) return true;
        // 同步对比左子树和右子树,因此新建一个方法进行递归
        return isSymmetric(root.left, root.right);
    }
    public boolean isSymmetric(TreeNode r1, TreeNode r2) {
        // 1、判断结构是否相同(空指针)
        if(r1 == null && r2 == null) return true;
        if(r1 == null || r2 == null) return false;
        // 2、判断值是否相同
        if(r1.val != r2.val) return false;
        // 3、若既同构,而且值也相等,则应递归
        boolean flag = false;
        flag = isSymmetric(r1.left, r2.left) && isSymmetric(r1.right, r2.right);
        return flag;
    }
}

木秀于林,风必摧之;堆出于岸,流必湍之;行高于人,众必非之。

以上是关于剑指 Offer 28. 对称的二叉树无取巧,易于理解!的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer:对称的二叉树28

剑指offer--28对称的二叉树

剑指 Offer 28. 对称的二叉树

剑指offer面试题 28. 对称的二叉树

剑指Offer打卡28.对称的二叉树

剑指Offer打卡28.对称的二叉树