【刷题记录】33.对称的二叉树

103 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

题目来源:LeetCode>对称的二叉树

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

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

二、思路分析:

思路一:

  1. 基本判断:root == null 返回true ,否则就进递归
  2. 如果左右子树都为空直接返回true,说明到底结束了
  3. 如果左右子树有一个为空,另一个不为空,或者是左右子树都不为空,但是他们的值不相同,返回false
  4. 判断 左右子树是否是镜像也相同的。我们知道,镜像相同说明,(root.left.left == root.right.right) && (root.left.right == root.right.left)

思路二:

  1. 利用翻转二叉树的方法与原二叉树比较,最开始始终返回true
  2. 翻转时改变了原来二叉树的结构,导致比较时始终传入的都是相同的两棵树
  3. 在翻转时创建一个新的树,而不是原地修改旧树,将新的翻转后的树与原树比较即可

三、AC代码:

思路一:

    class Solution {
        public boolean isSymmetric(TreeNode root) {
            return root == null ? true : isSymm(root.left, root.right);
        }

        boolean isSymm(TreeNode firstNode, TreeNode secondNode) {
            if (firstNode == null && secondNode == null) return true;
            if (firstNode == null || secondNode == null || firstNode.val != secondNode.val) return false;
            return isSymm(firstNode.left, secondNode.right) && isSymm(firstNode.right, secondNode.left);
        }
    }

思路二:

    class Solution {
        public boolean isSymmetric(TreeNode root) {
            TreeNode tmpNode = root;
            TreeNode rootNode2 = mirror(tmpNode);
            return isEquals(rootNode2, root);
        }

        private TreeNode mirror(TreeNode root) {
            if (root == null) {
                return null;
            }
            TreeNode newRoot = new TreeNode(root.val);
            TreeNode tmpNode = root.left;
            newRoot.left = mirror(root.right);
            newRoot.right = mirror(tmpNode);
            return newRoot;
        }

        private boolean isEquals(TreeNode rootNode1, TreeNode rootNode2) {
            if (rootNode1 == null && rootNode2 == null) return true;
            if (rootNode1 == null || rootNode2 == null) return false;
            return rootNode1.val == rootNode2.val && isEquals(rootNode1.left, rootNode2.left)
                    && isEquals(rootNode1.right, rootNode2.right);
        }
    }