二叉树 101对称二叉树

需求:

给你一个二叉树的根节点 root , 检查它是否轴对称。
示例1:

对称二叉树

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

示例2

image.png

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

leetcode题目链接

思路

对称二叉树实际是看左右元素是否可以以中线对折,如果能对折说明是对称的。

首先想清楚,判断对称二叉树要比较的是哪两个节点,要比较的可不是左右节点!

对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了其实我们要比较的是两个树(这两个树是根节点的左右子树),所以在递归遍历的过程中,也是要同时遍历两棵树。

那么如何比较呢?

比较的是两个子树的里侧和外侧的元素是否相等。如图所


image.png

那么遍历的顺序应该是什么样的呢?

本题遍历只能是“后序遍历”,因为我们要通过递归函数的返回值来判断两个子树的内侧节点和外侧节点是否相等。

正是因为要遍历两棵树而且要比较内侧和外侧节点,所以准确的来说是一个树的遍历顺序是左右中,一个树的遍历顺序是右左中。

但都可以理解算是后序遍历,尽管已经不是严格上在一个树上进行遍历的后序遍历了。

其实后序也可以理解为是一种回溯,当然这是题外话,讲回溯的时候会重点讲的。

说到这大家可能感觉我有点啰嗦,哪有这么多道理,上来就干就完事了。别急,我说的这些在下面的代码讲解中都有身影。

那么我们先来看看递归法的代码应该怎么写。

递归法

  /**
 * 对称二叉树
 * 对称二叉树实际是对比两个二叉树是否相等
 */
public class IsSymmetric101 {
    public boolean isSymmetric(TreeNode root) {
        return compare(root.left, root.right);
    }

    // 递归三要素 一 确定传参
    public boolean compare(TreeNode left, TreeNode right) {
        // 递归三要素 二 确定结束条件
        if (left == null && right != null) return false;
        if (left != null && right == null) return false;
        if (left == null && right == null) return true;
        if (left.val != right.val) return false;

        // 递归三要素 三 实现实体
        boolean outside = compare(left.left, right.right);
        boolean inside = compare(left.right, right.left);

        return outside && inside;
    }
}
验证结果

后续补充:迭代法

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容