003-对称二叉树-2020.03.09|刷题打卡

292 阅读2分钟

题目

级别: 简单

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

例如,二叉树 [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. 好吧,拿到题目的第一时间,我的想法是观察二叉树顺序遍历的数组,发现了一些特征

    • 二叉数的层级(高度),每层(包含null)的数量为2的n次方
    • 想办法拿到每一层的值数组
    • 查看这个一维数组是否对称
    • 找到第一个不对称的false返回或者遍历完返回true
  2. 思考了半天,参考了一些很奇怪的东西,决定使用LinkedList,借用队列的特性,不断的遍历数,直到得到足够大小的list,list.size()=2,4,8,16...,判断这个list是否对称并清空

  3. 想法很美好,现实很残酷

    [3,4,4,5,null,null,5,6,null,null,6]
    					3
    				4		4
    			5	n		n	5
    		  6 n				n 6
    

    一个这样的二叉树,在遍历过程中,发现实在是有点难以填充null,最终放弃

第二次尝试:

  1. 继续观察树的特征,有其实上面的那个树

  2. 发现从根节点开始,左右对称

  3. 所以分解问题,根节点左右子树对称

  4. 递归遍历左右节点的child,判断是否对称

    即check(left.left, right.right) && check(left.right, right.left)

    左子树的左子树和右子树的右子树是否相等 &&

    左子树的右子树和右子树的左子树是否相等

  5. 不等就返回false,全等最终返回true

code

class Solution {
    public boolean isSymmetric(TreeNode root) {
        TreeNode left = root.left;
        TreeNode right = root.right;
        return check(left, right);
    }

    private boolean check(TreeNode left, TreeNode right) {
        if (left == null && right == null) {
            return true;
        }
        if (left == null || right == null) {
            return false;
        }
        boolean b = left.val == right.val;
        if(!b){
            return b;
        }
        return  check(left.left, right.right) && check(left.right, right.left);
    }

    public static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode() {
        }

        TreeNode(int val) {
            this.val = val;
        }

        TreeNode(int val, TreeNode left, TreeNode right) {
            this.val = val;
            this.left = left;
            this.right = right;
        }

    }

    public static void main(String[] args) {
        //[2,3,3,4,5,5,4,null,null,8,9,null,null,9,8]
        Solution solution = new Solution();
        TreeNode treeNode = new TreeNode(3);
        treeNode.left = new TreeNode(4);
        treeNode.right = new TreeNode(4);

        treeNode.left.left = new TreeNode(5);
        treeNode.right.right = new TreeNode(5);

        treeNode.left.left.left = new TreeNode(6);
        treeNode.right.right.right = new TreeNode(6);
        System.out.println(solution.isSymmetric(treeNode));
    }
}

截图

截图1

  • 本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情