剑指[28]_对称的二叉树

Posted 小智RE0

tags:

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

题目来源:剑指 Offer 28. 对称的二叉树
题目描述

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

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

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

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

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

考虑用递归的办法,先把树的根结点左右结点放入;

  • 这时左右结点若同时为空;那么直接返回对称;
  • 左右结点若一边为空的,另一边有值,那么直接断定必然不是对称的;
  • 左右结点的值要是不相等,那么直接就是不对称的;
  • 注意在递归的时候比较的是,左子树的左结点和右子树的右结点; 还有 左子树的右结点和右子树的左结点

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

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

public class Solution {
    public boolean isSymmetric(TreeNode root) {
        //首先判断空树
        if (root == null) return true;

        //把左右子树放入;进行判断;
        return isResult(root.left, root.right);
    }

    private boolean isResult(TreeNode left, TreeNode right) {
        //这里若两边都为空(或者说到达叶子节点下);结束;
        if (left == null && right == null) {
            return true;
        }
        //若半边树已经是空的,那么必然不符合;
        if (left == null || right == null) {
            return false;
        }
        //当左右的值不相等;必然不符合;
        if(left.val != right.val){
            return false;
        }

        //这里递归时注意,对称比较的是;
        //左树的左结点 和 右树的右结点;
        //左树的右结点 和 右树的左结点;
        return isResult(left.left,right.right) && isResult(left.right, right.left);
    }
}

以上是关于剑指[28]_对称的二叉树的主要内容,如果未能解决你的问题,请参考以下文章

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

剑指Offer:对称的二叉树28

剑指 Offer 28. 对称的二叉树

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

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

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